Ruby on rails Rails:通过保存和设置外键保存记录

Ruby on rails Rails:通过保存和设置外键保存记录,ruby-on-rails,associations,belongs-to,Ruby On Rails,Associations,Belongs To,有没有更好的方法来编写此代码?我只是觉得它不适合我,我觉得有些东西真的像rails,我应该已经知道了: belongs_to :parent_in_use belongs_to :parent_template def after_create new_parent_in_use = ParentInUse.create!(self.parent_template.attributes) self.update_attribute(:parent_in_use_id, new_pare

有没有更好的方法来编写此代码?我只是觉得它不适合我,我觉得有些东西真的像rails,我应该已经知道了:

belongs_to :parent_in_use
belongs_to :parent_template

def after_create
  new_parent_in_use = ParentInUse.create!(self.parent_template.attributes)
  self.update_attribute(:parent_in_use_id, new_parent_in_use.id)
end
创建记录后,我将使用所选的父模板,并基于它创建一个
parent\u in\u use
记录。通过这种方式,模板可以更改,正在使用的记录将永远与我的对象共存。ParentInUse和ParentTemplate类都使用STI从父类继承


我相信这应该足够简单,但我不知道如何做,基本上我希望在一次操作中创建和分配记录。

这将满足您的要求

def after_create 
  self.parent_in_use = ParentInUse.create!(parent_template.attributes)
end
然而,如果没有其他的改变,它不会对你有任何好处。由于外键存储在当前模型中,因此如果此关联是通过after_create回调创建的,则ActiveRecord不会保存更改。新的ParentInUse对象将被保存,但当前模型的数据库行不会用对应的ParentInUse id更新


在创建相应记录之前,我想100%确信当前的\u模型存在。如果模型无效,我假设它不会到达创建前回调?这是一个有效的假设。此外,所有回调都封装在单个事务中,如果其中任何回调返回false或引发错误,则整个事务将回滚。因此,除非一切顺利,否则不会创建ParentInUse。