Beste Ansatz, um zu sparen, Benutzer-Einstellungen?
Habe ich gesehen, zwei verschiedene Ansätze, das speichern von Benutzervorgaben.
ANSATZ 1:
Serialisieren Sie, und speichern Sie in einem der Spalte der Tabelle USERS
ANSATZ 2:
Erstellen einer separaten Tabelle EINSTELLUNGEN und stellen Sie eine has_many-Zuordnung von BENUTZER-EINSTELLUNGEN.
Welche der beiden oben genannten Ansätze würdet Ihr bevorzugen und was sind die vor-und Nachteile der einzelnen über andere?
- Welche Art von Vorliebe du speichern? Boolean ist? Mehrere Elemente?
- das wäre Mehrere Elemente. Ich Neige dazu, lehnen in Richtung der Option 2, aber durch den Blick auf die Schienen serialisieren option, ich fühle mich wie die Verwendung von Hash-als eine option, option 1 erreicht werden könnte, mehr oder weniger ähnlich zu option 1, da durch eine nicht mit einer anderen Tabelle und weitere SQL-joins. Jedes feedback wird sehr geschätzt. Auch, was genau Sie Jungs, die meinen, durch überladen der Tabelle BENUTZER alle Einstellungen werden gespeichert-Einstellungen-Spalte nur.
- Unordnung bedeutet, dass der Benutzer-Tabelle ist jetzt eher verwirrend, weil es nicht mehr als nur (wie ich vermute) halten Sie login/name-information. Wenn Sie serialisieren, es bedeutet mehr Arbeit, wenn Sie brauchen, um sich die Dinge zu. Im Grunde müssen Sie analysieren ALLE Einstellungen JEDES mal, wenn Sie brauchen, um wissen ein. Setzen Sie die Einstellungen (wenn es nur ein paar) als Felder der user-Tabelle ist besser als die blob-o' prefs, weil Sie nicht haben, zu betrachten, alle prefs zu finden, aus eine.
- danke für das feedback, also option 2 ist es dann.
- "Im Grunde müssen Sie analysieren ALLE Einstellungen JEDES mal, wenn Sie müssen eines wissen" -- ja, und das Parsen von YAML ist unglaublich schnell. FWIW, niemand gibt irgendwelche realen Gründen hier, es ist Reine religion.
- Ich Stimme zu: wenn Sie als Attribute abgelegt, dann jedes Attribut wird analysiert, jedes mal, wenn das Objekt aus der Datenbank geladen wird. Gleiche Problem.
- für schiene 4 - api.rubyonrails.org/classes/ActiveRecord/Store.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es normalerweise eine gute Idee zu Gunsten der Normalisierung. Die zweite Lösung hält Ihre Modelle Reiniger, ermöglicht eine einfache Erweiterbarkeit, wenn neue Einstellungen werden Hinzugefügt, und hält Ihre Tabellen übersichtlich.
Ich Rang mit dieser gleichen Frage, so dass ich dachte, ich würde teilen, was ich gefunden in einem "community-wiki" zu beantworten.
Serialisierung in einem einzelnen Attribut
Einfache Benutzer-Einstellungen für Ihre Rails-app ist ein blog-post beschreibt, wie Sie dies tun.
Bearbeiten eines serialisierten hash, der in eine form? beschreibt, wie zum Bearbeiten so eines hash in eine form.
Ein hilfreicher trick ist es, die form von
OpenStruct.new(@user.preferences)
hash automatisch accessor-Methoden für die einzelnen hash-Attribut.FARBSTOFF/has_serialized - GitHub ermöglicht Ihnen das Bearbeiten dieser Attribute in der serialisierten hash als Attribute auf die (Benutzer -) Modell.
Einstellungen in einer separaten Tabelle
Best practice zum speichern der Benutzer-Einstellungen? hat einige Tipps. Im folgenden sind einige libs, darunter zwei aus einer anderen Antwort von @hoffnungslos.
Können Sie auch versuchen, metaprogramming:
Praktische Metaprogramming mit Ruby: Speichern von Einstellungen
Eine verbesserte version des ersten Ansatz hatte werden können, wenn Sie auf PostgreSQL 9.2/3+ und Schienen 4+. Sie können
store_accessor
zum speichern von Einstellungen in einer PostgreSQL hstore-Spalte mit support für Validierungen und Abfragen.user.receive_newsletter => 'true'
User.where("preferences->'receive_newsletter' = 'true'")
Sehen http://mikecoutermarsh.com/using-hstore-with-rails-4/ für mehr details (Migrationen) und ein besonderer Hinweis auf den Umgang mit Boolean.
Ansatz 2
Können Sie Einstellungen hinzufügen, ohne überladen die user-Tabelle
Gibt es einige Rails-plugins zum verarbeiten dieser Anwendungsfall:
Boolesche Einstellungen, verwendet eine einzelne Spalte für mehrere Einstellungen)
(flexibler, verwendet eine separate Tabelle, einige nette syntaktische Zucker)
prefereneces
scheint veraltet. es funktioniert nicht mit Rails 4.Ich würde Ansatz 2, denn es ist sauberer und einfacher zu aktualisieren. Sie werden in der Lage sein, fügen Sie weitere Einstellungen, wie Komplex, wie Sie möchten.
Wird es ein bisschen langsamer, da Sie über einen join zu tun, aber es wird es Wert sein
2016, würde ich wieder Option 2.
Warum?
Lesen Sie mehr