0

ユーザーの好みを容易にするメカニズムを探しています。また、現在ログインしているユーザーに特定の設定が設定されていない場合に使用される「マスター」設定のセットも必要です。これに似た質問がいくつか見られますが、質の高いソリューションを単に提案するのではなく、理論に基づいているようです。

基本的に、管理とストレージ (モデル、コントローラーなど) に関する情報を探しています。最初は、50 列以上の正規化されたテーブル (パフォーマンスなど) を使用することを検討していました。ただし、将来的にはさまざまな未知の設定を追加する予定であり、パフォーマンスはさておき、複数の列が手に負えなくなることは想像に難くありません。考え?

4

2 に答える 2

1

データベース内の個々の設定を操作したり並べ替えたりする必要がない場合は、単一のビットマスク (整数) 列を使用することをお勧めします。基本的に、ビットマスクは 2 進数で表されるオン/オフ スイッチのセットです。たとえば、次の 3 つの設定があるとします。

  1. サブスクリプションを表示
  2. 色を見る
  3. フルネームを表示

ユーザーが 1 と 3 をオンにし、2 をオフにしているとします。オンに 1、オフに 0 を使用すると、このビットマスクは次のようになります。

101

(オンオフオン)

これは、バイナリで 5 で5あるため、データベースに格納されます。101ビットマスクはデータベースに簡単に保存でき (1 つの整数列を使用)、演算子を理解していれば (ユーザーの設定をサイトの既定値にマージするため)、簡単に操作できます。Ryan Bates が、Rails でのビットマスクの使用に関する優れたチュートリアル: Embedded Associationを公開しています。うまくいけば、あなたが探している具体的な例が得られます。

于 2009-12-22T04:14:45.013 に答える
0

私の考えでは、デフォルトを定義して使用する最良の方法は、ユーザー設定テーブルに別の行を追加し、それをクラス変数としてモデルにロードすることです。次に、設定が見つからない場合は、アクセサーをオーバーライドしてデフォルトを見つけます。このようなもの:

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 に設定した場合に問題が発生します。

編集:NBサーバーを再起動せずにレールアプリのデフォルトを更新する良い方法がわかりません。

于 2009-12-22T14:46:10.630 に答える