2011-09-16 63 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 

(所以这个值没有被保存到数据库中)。

这是我的问题:如何让UserSetting自动保存,当其中一个属性被更改,然后由其用户保存?

这应该只发生在UserSetting属性发生变化时,否则每次将用户保存到数据库时,都会触发额外的不需要的数据写入操作&。

+0

是否变化总是通过形式?这样可以在fields_for中使用accept_nested_attributes。 – lulalala

回答

9

我会探索使用ActiveRecord callback为此。我不确定哪种情况对您的情况最有意义,但before_updateafter_update似乎合乎逻辑。在您的回调中,您需要在与用户关联的UserSetting对象上手动触发保存呼叫。很可能有几十种方法来做到这一点,但这些方针的东西应该工作:

class User < ActiveRecord::Base 
    after_update do |user| 
    user.user_setting.save if user.user_setting.changed? 
    end 
end 
6

您的用户模型user_setting联合使用自动保存:真

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

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