[英]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.