2011-09-16 10 views
9

私は、User.rbモデルと、委任したいUserSetting.rbモデル(getterメソッドとsetterメソッドの両方)を持っています。一見Rails代理人設定値

user.rbで

delegate :email_opt_in, :email_opt_in=, :to => :user_setting 

これは素晴らしい作品。

user = User.find(1) 
user.email_opt_in #=> false 
user.email_opt_in = true 
user.save 
user.email_opt_in #=> true 

しかし、user.saveはUserSettingモデルに反映されません近くに探して。

User.find(1).email_opt_in #=> false 

(値はデータベースに保存されませんでした)。

これは私の質問です。その属性の1つが変更され、そのユーザーによって保存されると自動的に保存するにはどうすればよいですか?

これは、UserSetting属性が変更された場合にのみ発生します。そうしないと、ユーザーがデータベースに保存されるたびに、不必要な追加書き込みがデータベースに追加されます(&)。

+0

は変化は常にフォームを通過していますか?そうすれば、fields_forでaccepts_nested_attributesを使うことができます。 – lulalala

答えて

9

これについては、ActiveRecord callbackを使用して検索します。私はどちらがあなたのケースで最も理にかなっているかわかりませんが、before_updateまたはafter_updateは論理的に見えます。コールバックでは、Userに関連付けられたUserSettingオブジェクトでセーブコールを手動でトリガする必要があります。そここれを実現する方法の数十は、おそらくですが、これらの線に沿って何か作業をする必要があります:

アソシエーション使用自動保存をuser_settingためのあなたのUserモデルで
class User < ActiveRecord::Base 
    after_update do |user| 
    user.user_setting.save if user.user_setting.changed? 
    end 
end 
6

:真

class User < ActiveRecord::Base 
    has_one :user_setting, autosave: true 

    delegate :email_opt_in, :email_opt_in=, :to => :user_setting 
end