Rails4 Friendly_id Einzigartige Slug-Formatierung

7

Ich verwende "friendly_id", um meine Modelle zu stupsen. Da der Slug eindeutig sein muss, wenn ich die gleichen Daten einchecke, bekomme ich einen langen Hash in der Slug angehängt.

%Vor%

Gibt es eine Möglichkeit, friendly_id zu sagen, um besser formatierte Slugs wie explore-1 und explore-2

zu erhalten

Version: friendly_id 5.0.4

    
Harsha M V 19.06.2014, 12:15
quelle

4 Antworten

9

Einverstanden, es scheint wie ziemlich grob Verhalten.

Wenn Sie sich den Code von friendly_id/slugged.rb ansehen, gibt es zwei Funktionen, die Konfliktauflösungslogik übergeben:

%Vor%

Also, die Idee ist nur, es zu verpatzen. Ich sehe 2 Optionen:

  1. Fügen Sie einfach resolve_friendly_id_conflict hinzu, fügen Sie Ihr zufälliges Suffix hinzu.

  2. Ändere die Logik beider Methoden mit der Absicht, alle Kandidaten zu testen, bis slug_generator.generate(candidates) etwas zurückgibt, das nicht leer ist. Wenn alle Kandidaten nil geben, dann fallback auf resolve_friendly_id_conflict method. Mit dieser Technik können Sie Slug-Kandidaten verwenden, um das id des Modells anzufügen, wenn der Slug nicht eindeutig ist.

Idealerweise wäre es schön, wenn die Autoren von Gem eine Konfigurationsoption hinzugefügt hätten, um die Auflösung der einzelnen Slags (Methodensymbol oder Proc-Generator und Kandidaten als Parameter) zu handhaben oder einfach zu überprüfen, ob das Modell auf eine Methode reagiert.

Außerdem wird in einigen Anwendungsfällen eine einzigartige Slugs-Auflösung überhaupt nicht benötigt. Zum Beispiel, wenn wir uns nur auf validates_uniqueness_of :slug oder Eindeutigkeitsvalidierung von Kandidaten verlassen wollen.

    
x3mka 27.06.2014, 09:08
quelle
10

Wenn also irgendjemand auf dieses Problem stößt, habe ich ein Update, das ich gerne als Kommentar in Tirdadcs Kommentar eingefügt hätte, aber ich kann nicht (nicht genug Reputation). Also, hier gehts:

Tirdadcs Antwort ist in der Theorie perfekt, aber leider ist die ID eines Objekts noch nicht an dem Punkt zugewiesen, an dem slug_candidates aufgerufen wird, also müssen Sie ein wenig tricksen. Hier ist der vollständige Weg, um einen Slug mit der ID des Objekts zu erhalten:

%Vor%

Du setzt also den Slug nach der Erschaffung des Objekts und dann, nachdem das Objekt erstellt wurde, nimmst du den Slug heraus und führst einen Speichervorgang durch, der den Slug neu zuweisen wird (jetzt mit der ID intakt). Ist das Speichern eines Objekts in einem after_create-Aufruf gefährlich? Wahrscheinlich, aber es scheint für mich zu funktionieren.

    
user3062913 20.11.2014 15:48
quelle
7

Ich würde empfehlen, das Modul :scoped zu verwenden, wenn Sie UUIDs in Ihren Nackteilen vermeiden wollen, wenn Sie mit Kollisionen zu tun haben. Hier ist die Dokumentation zusammen mit einem Beispiel:

Ссылка

Versuchen Sie es mit :scope => :id , da jede ID sowieso eindeutig ist und sehen Sie, ob das für Sie funktioniert.

UPDATE:

Um genau das zu bekommen, was Sie wollen, haben Sie jetzt candidates zu diesem Zweck in Version 5:

%Vor%     
tirdadc 19.06.2014 12:26
quelle
2

Heute kam ich über dieses Thema und während andere Antwort mir half, anzufangen, war ich nicht zufrieden, weil, wie Sie, ich wollte, dass die Schnecken in Reihenfolge wie explore , explore-2 , explore-3 erscheinen.

Also, hier ist, wie ich es behoben habe:

%Vor%

Ich habe die Eindeutigkeitsprüfung für :slug nur dann verwendet, wenn dieses Modell im gleichzeitigen Code verwendet wird.

Hier können Sie sehen, wie es funktioniert:

%Vor%

Wenn Sie sqlite3 adapter verwenden, müssen Sie auch sqlite3_ar_regexp gem installieren (es wird nicht sehr schnell sein, da SQLite kein REGEXP () hat und stattdessen Ruby-Code auswertet).

    
Almir Sarajčić 18.03.2015 11:59
quelle