我有一个父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
时,它不会保存子模型。
最有效的解决方法是什么?
谢谢!
答案 0 :(得分:0)
好的,为任何好奇的人找到了解决方案 - 自动保存
ActiveRecord::AutosaveAssociation
是一个有助于实现此目的的模块 - 在保存父级时正确保存子关联。
只需要添加autosave: true
即可。示例 -
has_one :contact, autosave: true
它还负责销毁标记为删除的记录以及其他一些奇特的东西。
我也做了一个快速检查,除非确实需要,否则它很聪明地没有击中数据库。也就是说,如果仅更新父级,则不会将子关联与其他SQL UPDATE
语句保存起来。
查看文档here。