从父模型覆盖子关联的setter

时间:2016-04-06 21:15:19

标签: ruby-on-rails-4 activerecord activemodel

我有一个父User模型,每个用户has_one Contact都拥有用户的联系信息。

其中一个联系人字段是email。由于本问题背景之外的各种遗留原因和原因,我希望能够直接致电#email,就好像它是User

的属性一样

换句话说,我想这样做 -

user.email
user.email = "foo@example.com"

而不是这个 -

user.contact.email
user.contact.email = "foo@example.com"

我按照以下方式布置了我的模型,从父User覆盖孩子的吸气/设定器 -

class User < ActiveRecord::Base
  has_one :contact

  def email
    contact.email
  end

  def email=(value)
    contact.email = value
  end
end

class Contact < ActiveRecord::Base
  belongs_to :user
end

您可能已经注意到setter的问题 - 保存User时,它不会保存子模型。

最有效的解决方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,为任何好奇的人找到了解决方案 - 自动保存

ActiveRecord::AutosaveAssociation是一个有助于实现此目的的模块 - 在保存父级时正确保存子关联。

只需要添加autosave: true即可。示例 -

has_one :contact, autosave: true

它还负责销毁标记为删除的记录以及其他一些奇特的东西。

我也做了一个快速检查,除非确实需要,否则它很聪明地没有击中数据库。也就是说,如果仅更新父级,则不会将子关联与其他SQL UPDATE语句保存起来。

查看文档here