2009-11-05 16 views
22

Zastanawiam się, jaki jest najlepszy sposób przechowywania ustawień użytkownika? W przypadku aplikacji Web 2.0 chcę, aby użytkownicy mogli wybierać określone ustawienia. W tej chwili jest to tylko wtedy, gdy otrzymujesz powiadomienia e-mail.Szyny: najlepsza praktyka do przechowywania ustawień użytkownika?

Najprostszym sposobem jest po prostu utworzenie "Ustawienia" modelu i kolumna dla każdego ustawienia, a następnie stosunek 1-1 z użytkownikami.

Ale czy istnieje wzór, aby rozwiązać ten problem lepiej? Czy może lepiej przechowywać informacje w samej tablicy użytkownika? A może powinienem użyć tabeli z "settings_name" i "settings_value", aby były całkowicie otwarte na temat rodzaju przechowywanych tam ustawień (bez konieczności wykonywania jakichkolwiek migracji podczas dodawania opcji)?

Jaka jest Twoja opinia?

Dzięki

Odpowiedz

5

Używamy pomocnej wtyczki o nazwie HasEasy. Przechowuje dane w pionowej tabeli, ale umożliwia dodawanie walidacji, przetwarzanie wstępne/końcowe, typy itp.

+0

To brzmi interesująco, ale link, który wysłałeś, jest martwy. Również Google nie pomógł. Jakieś wskazówki, gdzie znaleźć wtyczkę? –

+1

link działa dla mnie – DanSingerman

+0

dziwne, dostaję "Strona nie istnieje" na http://github.com/cjbottaro/has_easy –

11

„otwartego” podejście stół utrudnia model z AR, ponieważ nie musisz się martwić o typach danych (boolean, int, string, etc). Zawsze dodawałem prefs jako kolumny tabeli użytkowników, a następnie przenosiłem je do tabeli user_preferences, jeśli jest ich "zbyt wiele". Jest to proste i łatwe w obsłudze.

+0

Tak właśnie modeluję bieżący projekt, jednak zastanawiam się, w jaki sposób uzyskujesz dostęp do preferencji użytkownika na poziomie całej witryny? Czytałem wiele postów o tym, jak trudno jest uzyskać dostęp do bieżącego użytkownika w modelu, że wszystkie dane sesji powinny być zarządzane w kontrolerze. w moim przypadku mam modele/widoki zależne od bieżącego użytkownika. Na przykład, jeśli aktualny użytkownik przegląda samochody, zawsze chcę pokazać rozmiar zbiornika samochodu jako "litry" lub "galony" w zależności od bieżących ustawień użytkownika. Czy naprawdę należy to robić za każdym razem, gdy chcę zobaczyć @ car.tank_size (current_user)? – FireDragon

10

Jeśli ustawienia użytkownika nie mają być możliwe do znalezienia (za pomocą opcji User.find_by_x_preference, np.) może również przechowywać je w postaci spersonalizowanej kolumny jako hash. Jest to przypadek użycia opisany w dokumentach na szynach (http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002334&name=serialize#).

class User < ActiveRecord::Base 
    serialize :preferences 
end 

u = User.new 
u.preferences = {:favorite_color => "green", :favorite_book => "Moby Dick"} 
+2

ładny i czysty, ale jest to "lookup + parsa" zamiast "lookup". jeśli często używasz ustawień dla logiki aplikacji, może to spowolnić działanie. – brittohalloran

+0

Byłoby fajnie, gdyby to można było dobrze zintegrować z konstruktorem formularzy. – lulalala

+3

Problem, który napotkałem przy pomocy tej techniki, polega na tym, że po dodaniu nowej preferencji, tj.'' ': favorite_food => pizza''' nie ma prostego sposobu na ustawienie domyślnych ustawień dla wszystkich użytkowników, co byłoby, gdyby istniała prosta kolumna DB. – earnold

12

Jeśli korzystasz z PostgreSQL, najlepszym rozwiązaniem jest użycie https://github.com/diogob/activerecord-postgres-hstore/. Jest to prosty, szybki i niezawodny sposób przechowywania skrótów w bazie danych. Ponieważ nie jest to tylko zserializowane pole tekstowe, możesz je również przeszukiwać i nie musisz tworzyć nowej tabeli, jak w HasEasy.

def User 
    serialize :preferences, ActiveRecord::Coders::Hstore 
end 

user = User.create preferences: { theme: "navy" } 
user.preferences['theme'] 
+7

Już nie potrzebujesz klejnotu na szynach4! Sprawdź [to how-to] (http://mikecoutermarsh.com/using-hstore-with-rails-4/) – fotanus

Powiązane problemy