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)