ユーザー設定を保存する 2 つの異なるアプローチを見てきました。
アプローチ 1: それらをシリアル化し、USERS テーブルの列の 1 つに保存する
アプローチ 2: 別のテーブル PREFERENCES を作成し、USERS から PREFERENCES への has_many 関連付けを作成します。
上記の 2 つのアプローチのどちらを優先しますか? また、それぞれの長所と短所は何ですか?
ユーザー設定を保存する 2 つの異なるアプローチを見てきました。
アプローチ 1: それらをシリアル化し、USERS テーブルの列の 1 つに保存する
アプローチ 2: 別のテーブル PREFERENCES を作成し、USERS から PREFERENCES への has_many 関連付けを作成します。
上記の 2 つのアプローチのどちらを優先しますか? また、それぞれの長所と短所は何ですか?
通常は、正規化を優先することをお勧めします。2 番目の解決策は、モデルをよりクリーンに保ち、新しい設定が追加された場合に簡単に拡張できるようにし、テーブルを整然とした状態に保ちます。
私はこの同じ質問に取り組んだので、「コミュニティ ウィキ」の回答で見つけたものを共有すると思いました。
Rails アプリのシンプルなユーザー設定は、これを行う方法を説明するブログ投稿です。
フォームでシリアル化されたハッシュを編集しますか? このようなハッシュをフォームで編集する方法について説明します。便利なトリックは、OpenStruct.new(@user.preferences)
ハッシュからフォームを作成して、各ハッシュ属性のアクセサ メソッドを自動的に作成することです。
DYE/has_serialized - GitHubでは、シリアル化されたハッシュ内のこれらの属性を (ユーザー) モデルの属性として扱うことができます。
ユーザー設定を保存するベストプラクティスは? にはいくつかのヒントがあります。以下は、@絶望による別の回答からの2つを含むいくつかのライブラリです。
メタプログラミングを試すこともできます: Ruby での実用的なメタプログラミング: 設定の保存
PostgreSQL 9.2/3 以降および Rails 4 以降を使用している場合は、最初のアプローチの改良版を使用できます。store_accessor
検証とクエリをサポートする PostgreSQL hstore 列に設定を保存するために使用できます。
class User
store_accessor :preferences, :receive_newsletter
validates :receive_newsletter, presence: true
end
user.receive_newsletter => 'true'
User.where("preferences->'receive_newsletter' = 'true'")
詳細(移行) とブール値の処理に関する特別な注意事項については、http://mikecoutermarsh.com/using-hstore-with-rails-4/を参照してください。
アプローチ 2
ユーザーテーブルを乱雑にすることなく、設定を追加できます
このユースケースを処理する Rails プラグインがいくつかあります。
2の方がクリーンで更新が簡単なので、 2に近づきます。必要に応じて複雑な設定を追加できます。
参加する必要があるため、少し遅くなりますが、それだけの価値はあります
2016 年には、オプション 2を支持します。
ユーザー設定は、すべてのアプリケーションの中核となる傾向があります。すべてのリクエストでそれらが取得される場合、リクエストごとに追加のクエリを作成することになります。設定ごとに個別の列が必要な場合は、個別のテーブルを使用するのが理にかなっています。しかし、jsonb を使用しているので、それは問題ではありません。たったの1列です。