2009-11-05 11 views
22

ユーザー設定を保存する最善の方法は何ですか? Web 2.0アプリでは、ユーザーが特定の設定を選択できるようにします。現時点では、電子メール通知を受信するタイミングのみです。Rails:ユーザー設定を保存するベストプラクティス?

モデル「設定」を作成してすべての設定用の列を作成し、ユーザーと1-1の関係にするのが最も簡単な方法です。

これを解決するパターンはありますか?それはおそらくユーザーテーブル自体に情報を格納する方が良いですか?または、「settings_name」と「settings_value」のテーブルを使用して、そこに保存されている設定のタイプについて完全に開く必要があります(オプションを追加するときに移行を実行する必要はありません)。

あなたの意見は?あなたはデータの種類(ブール、整数、文字列など)を心配する必要があるため

おかげ

答えて

5

HasEasyという便利なプラグインを使用します。データを垂直テーブルに保存しますが、バリデーション、前後のストレージ処理、タイプなどを追加することができます。

+0

興味深いと思うが、あなたが投稿したリンクは死んでいる。また、Googleは役に立たなかった。プラグインを見つけるためのヒント? –

+1

リンクが私のために働く – DanSingerman

+0

奇妙なことに、私はhttp://github.com/cjbottaro/has_easyに「ページは存在しません」と表示されます。 –

11

「オープン」テーブルのアプローチは、それが困難なARをモデル化することができます。私はいつもusersテーブルのカラムとしてprefsを追加していますが、あまりにも多くのテーブルがある場合はuser_preferencesテーブルに移動します。シンプルで、操作が簡単です。

+0

これは私が現在のプロジェクトをモデリングしている方法ですが、私はユーザー設定をサイト全体にどのようにしてアクセスしていますか?私は、モデル内の現在のユーザーにアクセスしようとすると、すべてのセッションデータがコントローラで管理されるべきであるということについて、多くの記事を読んできました。私の場合、現在のユーザーに依存するモデル/ビューがありますがたとえば、Current-UserがCarsをブラウズしている場合、現在のユーザー設定に応じて、カータンクのサイズを「Liters」または「Gallons」として表示したいと思っています。 @ car.tank_size(current_user)を見たいときは毎回これを行う必要がありますか? – FireDragon

10

ユーザー設定が(User.find_by_x_preference経由で)見つけられない場合は、それらをシリアル化された列にハッシュとして格納することもできます。これは実際にはrails docs(http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002334&name=serialize#)に記述されているユースケースです。

class User < ActiveRecord::Base 
    serialize :preferences 
end 

u = User.new 
u.preferences = {:favorite_color => "green", :favorite_book => "Moby Dick"} 
+2

素敵で清潔ですが、単に "検索"の代わりに "検索+解析"です。アプリロジックに頻繁に設定を使用している場合は、これが遅くなる可能性があります。 – brittohalloran

+0

これがフォームビルダーとうまく統合できれば涼しいでしょう – lulalala

+3

このテクニックで問題になったのは、新しい設定を追加するときです'' ':favorite_food => pizza'''単純な方法ですべてのユーザーのデフォルト設定を設定することはできません。単純なDB列があるとします。 – earnold

12

PostgreSQLを使用する場合は、https://github.com/diogob/activerecord-postgres-hstore/を使用することをお勧めします。これは、データベースにハッシュを格納するためのシンプルで高速で信頼性の高い方法です。シリアライズされたテキストフィールドだけでなく、HasEasyのように新しいテーブルを作成する必要もありません。

def User 
    serialize :preferences, ActiveRecord::Coders::Hstore 
end 

user = User.create preferences: { theme: "navy" } 
user.preferences['theme'] 
+7

これ以上rails4のための宝石は必要ありません! 「この方法」をチェックしてください(http://mikecoutermarsh.com/using-hstore-with-rails-4/) – fotanus

関連する問題