(Rails) MASTER PREFS フォールバックを使用した USER PREFS の管理…?
-
20-09-2019 - |
質問
ユーザーの好みを容易にするメカニズムを探しています。また、現在ログインしているユーザーが特定の設定を持っていない場合に使用される「マスター」設定のセットも必要です。これと同様の質問がいくつかありますが、単に質の高いソリューションを提案するのではなく、理論に踏み込んでいるように見えます。
基本的に、モデルやコントローラーなど、ストレージだけでなく管理に関する意見も求めています。当初は、(パフォーマンスなどの理由から) 50 列以上の正規化されたテーブルを単純に使用することを検討していました。ただし、将来的にはさまざまな未知の設定を追加する予定であり、パフォーマンスは別として、複数の列が手に負えなくなることが想像されます。考えは?
解決
私の心の中で、デフォルトを定義して使用するための最良の方法は、ユーザーの好みのテーブル内の別の行を追加して、モデル内のクラス変数としてそれをロードすることです。その後、好みが見つからなかった場合はデフォルト値を見つけるために、アクセサをオーバーライドします。このような何かます:
class UserPreference < ActiveRecord::Base
# load default preferences as a class variable
@@defaults ||= find(1).attributes
# redefine accessors or each column to load default if nil
column_names.each do |column|
method_name = "#{column}_with_default".to_sym
send :define_method, method_name do
value = send("#{column_without_default}")
case value
when nil
@@defaults[column]
else
value
end
end
alias_method_chain column, :default
end
...
end
(行1からロード)本質的にデフォルトの優先クラス変数としてモデルに格納されています。すべてのアクセサを再定義し、返された値がnilだった場合、デフォルトが返されるようにエイリアスメソッドチェーンの一部とされています。私が使用していた||代わりに例が、それはユーザーがfalseにブール値プリファレンスを設定していたことをイベントで問題が発生します。
編集:N.B.私は、サーバーを再起動せずにレールのアプリでデフォルト値を更新するための良い方法を知りません。
他のヒント
データベース内の個別の設定に基づいて操作または並べ替えを行う必要がない場合は、単一のビットマスク (整数) 列を使用することをお勧めします。基本的に、ビットマスクは 2 進数で表されるオン/オフ スイッチのセットです。たとえば、次の 3 つの設定があるとします。
- サブスクリプションを表示する
- 色を表示する
- フルネームを表示
ユーザーが 1 と 3 をオンにし、2 をオフにしているとします。オンに 1、オフに 0 を使用すると、このビットマスクは次のようになります。
101
(オンオフオン)
これはデータベースに次のように保存されます 5
なぜなら 101
は2進数で5です。ビットマスクはデータベースに簡単に保存でき (単一の整数列を使用)、演算子を知っていれば操作も簡単です (ユーザーの設定をサイトのデフォルトにマージするため)。Ryan Bates は、Rails でのビットマスクの使用に関する素晴らしいチュートリアルを提供しています。 埋め込みアソシエーション. 。探している具体的な例が得られることを願っています。