Rails代表集值

Sch*_*ems 11 ruby activerecord ruby-on-rails

我有一个User.rb模型和一个我想委托的UserSetting.rb模型(getter和setter方法).

在user.rb中

delegate :email_opt_in, :email_opt_in=, :to => :user_setting
Run Code Online (Sandbox Code Playgroud)

乍一看这很有效.

user = User.find(1)
user.email_opt_in #=> false
user.email_opt_in = true
user.save
user.email_opt_in #=> true
Run Code Online (Sandbox Code Playgroud)

但仔细观察,user.save不会传播到UserSetting模型.

User.find(1).email_opt_in #=> false
Run Code Online (Sandbox Code Playgroud)

(因此该值未保存到数据库中).

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

这应该仅在更改UserSetting属性时发生,否则每次将用户保存到数据库时,都会触发对数据库的其他不需要和不需要的写入.

小智 12

在user_setting关联的User模型中,使用autosave:true

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

  delegate :email_opt_in, :email_opt_in=, :to => :user_setting
end
Run Code Online (Sandbox Code Playgroud)


Pet*_*own 11

我会探索使用ActiveRecord回调.我不知道这会使得你的情况是最有意义的,但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
Run Code Online (Sandbox Code Playgroud)