Rails代表集值

时间:2011-09-16 20:31:12

标签: ruby-on-rails ruby activerecord

我有一个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属性发生更改时发生,否则每次将用户保存到数据库时,都会触发其他不需要的&不必要的写入数据库。

2 个答案:

答案 0 :(得分:10)

我会探索使用ActiveRecord callback。我不确定在你的情况下哪个最有意义,但before_updateafter_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}}