Ruby on rails Rails委托集值
我有一个User.rb模型和一个UserSetting.rb模型,我想委托给它们(getter和setter方法) 在user.rb中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
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用户:用户设置
结束
更改是否总是通过表单进行?这样就可以使用带有字段的嵌套属性!完美的这个答案应该是正确的。