48

ユーザー設定を保存する 2 つの異なるアプローチを見てきました。

アプローチ 1: それらをシリアル化し、USERS テーブルの列の 1 つに保存する

アプローチ 2: 別のテーブル PREFERENCES を作成し、USERS から PREFERENCES への has_many 関連付けを作成します。

上記の 2 つのアプローチのどちらを優先しますか? また、それぞれの長所と短所は何ですか?

4

7 に答える 7

22

通常は、正規化を優先することをお勧めします。2 番目の解決策は、モデルをよりクリーンに保ち、新しい設定が追加された場合に簡単に拡張できるようにし、テーブルを整然とした状態に保ちます。

于 2009-07-03T14:56:58.847 に答える
21

私はこの同じ質問に取り組んだので、「コミュニティ ウィキ」の回答で見つけたものを共有すると思いました。

単一の属性でシリアライズする

Rails アプリのシンプルなユーザー設定は、これを行う方法を説明するブログ投稿です。

フォームでシリアル化されたハッシュを編集しますか? このようなハッシュをフォームで編集する方法について説明します。便利なトリックは、OpenStruct.new(@user.preferences)ハッシュからフォームを作成して、各ハッシュ属性のアクセサ メソッドを自動的に作成することです。

DYE/has_serialized - GitHubでは、シリアル化されたハッシュ内のこれらの属性を (ユーザー) モデルの属性として扱うことができます。

別の表の設定

ユーザー設定を保存するベストプラクティスは? にはいくつかのヒントがあります。以下は、@絶望による別の回答からの2つを含むいくつかのライブラリです。

  • rails-settingsは、データベースに保存されているハッシュのようなキーと値のペアのテーブルを管理し、ActiveRecord のような単純な操作メソッドを使用します。あらゆる種類のオブジェクトを格納できます: 文字列、数値、配列、または YAML として記述できる任意のオブジェクト。(Rails 4.x および Rails 5.x を含む Rails 3.1 以降でテスト済み)
  • Preference-fuは単純なブール値の設定に適しており、単一の列を複数の設定に使用します (最終更新は 2009 年)。
  • 設定はより柔軟で、別のテーブルを使用し、いくつかの優れた構文糖衣を使用します。(最終更新 2011)
  • HasEasyはデータを垂直のテーブルに保存しますが、検証、保存前後の処理、型などを追加できます (2008 年最終更新)。

メタプログラミングを試すこともできます: Ruby での実用的なメタプログラミング: 設定の保存

于 2011-09-10T17:24:25.623 に答える
5

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/を参照してください。

于 2014-07-29T19:41:46.257 に答える
3

アプローチ 2

ユーザーテーブルを乱雑にすることなく、設定を追加できます

于 2009-07-03T14:55:26.960 に答える
3

このユースケースを処理する Rails プラグインがいくつかあります。

  • Preference-fu (単純なブール値の設定に適しています。単一の列を複数の設定に使用します)
  • 設定 (より柔軟で、別のテーブルを使用し、いくつかの優れた構文糖衣)
于 2009-07-03T15:18:10.293 に答える
1

2の方がクリーンで更新が簡単なので、 2に近づきます。必要に応じて複雑な設定を追加できます。

参加する必要があるため、少し遅くなりますが、それだけの価値はあります

于 2009-07-03T17:02:52.420 に答える
0

2016 年には、オプション 2を支持します。

なんで?

ユーザー設定は、すべてのアプリケーションの中核となる傾向があります。すべてのリクエストでそれらが取得される場合、リクエストごとに追加のクエリを作成することになります。設定ごとに個別の列が必要な場合は、個別のテーブルを使用するのが理にかなっています。しかし、jsonb を使用しているので、それは問題ではありません。たったの1列です。

続きを読む

于 2016-12-13T12:01:51.543 に答える