我有一个User.rb模型和一个我想委托的UserSetting.rb模型(getter和setter方法)。
在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 :(得分:10)
我会探索使用ActiveRecord callback。我不确定在你的情况下哪个最有意义,但before_update
或after_update
似乎是合乎逻辑的。在回调中,您需要在与User关联的UserSetting对象上手动触发保存调用。可能有很多方法可以实现这一目标,但这些方面的内容应该有效:
class User < ActiveRecord::Base
after_update do |user|
user.user_setting.save if user.user_setting.changed?
end
end
答案 1 :(得分:9)
在user_setting关联的User模型中,使用autosave:true
{{1}}