簡體   English   中英

有關每個用戶設置和預定義選項的最佳做法

[英]Best practices regarding per-user settings and predefining options

我想為我的用戶保存設置 ,其中一些是預定義列表中的一個! 使用https://github.com/ledermann/rails-settings ATM。

fe weight_unit的設置將超出[:kg,:lb]。

我真的不想將這些內容硬編碼到控制器中或查看代碼。

這是一種常見的功能,所以我在想:是否有人想出某種方式以DRY方式將業務抽象為類常量數據庫

通常,當我不得不存儲一些無關緊要的信息時,我會將它們存儲在序列化列中。

您可以在用戶表中創建一個新列(例如,將其稱為“設置”)。

之后,您添加到用戶模型

serialize :settings, Hash

從這一刻起,您可以將自己喜歡的內容放入設置中

user.settings = {:weight_unit => :kg, :other_setting1 => 'foo', :other_setting2 => 'bar'}

並使用user.save保存,您將在設置列中獲得序列化的數據。

Rails也會反序列化它,因此在獲取用戶記錄並調用user.settings之后,您將獲得該用戶所有保存的設置。

要獲取有關serialize()的更多信息,請參考文檔: http : //api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize

UPDATE1為確保設置在預定義列表中,您可以在用戶模型上使用驗證。

UPDATE2通常,如果有一些預定義的值,則將它們存儲在相關模型中的常量中是一種好習慣,這樣您就可以從模型(內部和外部)訪問它們。 可接受的值不會因實例而改變,因此在所有人之間共享它們是有意義的。 比任何單詞都有價值的例子。 定義用戶模型:

ALLOWED_SETTINGS = {:weight_unit => [:kg, :lb],
                  :eyes_color => [:green, :blue, :brows, :black],
                  :hair_length => [:short, :long]}

你都可以使用

  • 在模型本身之外

    用戶:: ALLOWED_SETTINGS

  • 在模型內部(在驗證,實例方法或任何您想要的地方)使用:

    ALLOWED_SETTINGS

根據您的問題,聽起來這些是特定用戶將從中選擇的更多配置選項,這些選項可能是完全靜態的,而不是動態的,因為這些選項會隨着時間變化。 例如,我懷疑您會添加:kg:lb以外的其他weight_units ,但可能是我誤解了您的問題。

如果我正確地閱讀了此內容,則建議(並使用過) config/目錄中的yml文件來獲取諸如此類的值。 yml文件可在應用程序范圍內訪問,並且所有“設置”都可以保存在一個文件中。 然后可以將它們作為常量加載到模型中,並按照@SDp的建議進行序列化。 但是,我傾向於謹慎一些,特別是當考慮到也許有一天可能要查詢這些“通用值”時,所以我寧願將它們中的每一個作為表中的一列而不是單個序列化值。 開銷並沒有那么多,並且Rails將它們作為單獨的列可以為您帶來很多內置的好處。

就是說,我個人已經將hstore與Postgres結合使用取得了巨大的成功,正好按照您的描述進行。 但是,我選擇在各個列上使用hstore的原因是因為我存儲了多個不同的人口統計信息,其中所有人口統計信息都可能隨時間變化(例如,可以添加一些鍵,更重要的是,可以刪除一些鍵。 )這聽起來像是您的情況,因為它們是基本特征,因此您極不可能刪除密鑰,但同樣,我可能是錯的。

TL; DR-我認為除非您有令人信服的理由(例如,定期添加和/或刪除鍵/設置),否則這些應該是數據庫表中的各個列。 如果您強烈認為這些應該存儲在序列化的數據庫中,並且使用的是Postgres,請查看hstore

如果您使用的是PostgreSQL,我認為您可以通過Rails 4 +這個寶石來觀看HStore https://github.com/devmynd/hstore_accessor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM