Ruby on rails Rails委托集值

Ruby on rails Rails委托集值,ruby-on-rails,ruby,activerecord,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 #=&g

我有一个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自动保存

只有当UserSetting属性发生更改时,才会发生这种情况,否则每次将用户保存到数据库时,都会触发对数据库的额外不必要和不必要的写入。

我将探讨如何使用。我不确定哪一个对你的情况最有意义,但更新之前的
或更新之后的
似乎是合乎逻辑的。在回调中,需要手动触发对与用户关联的UserSetting对象的保存调用。可能有几十种方法可以实现这一点,但按照这些方法应该可以做到:

class User < ActiveRecord::Base
  after_update do |user|
    user.user_setting.save if user.user_setting.changed?
  end
end
class用户
在用户设置关联的用户模型中使用autosave:true

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

  delegate :email_opt_in, :email_opt_in=, :to => :user_setting
end
class用户:用户设置
结束

更改是否总是通过表单进行?这样就可以使用带有字段的嵌套属性!完美的这个答案应该是正确的。