我有两种模式:
class Customer < ActiveRecord::Base
has_many :contacts
end
class Contact < ActiveRecord::Base
belongs_to :customer
validates :customer, presence: true
end
然后,在我的控制器中,我希望能够同时创建 “一”扫:
@customer = Customer.new
@customer.contacts.build
@customer.save
这个,失败了(不幸的是翻译开启,它转换为 类似于:联系方式:客户不能空白。)
@customer.errors.messages #=> :contacts=>["translation missing: en.activerecord.errors.models.customer.attributes.contacts.invalid"]}
在检查模型时,确实@customer.contacts.first.customer
是nil
。不知怎的,这是有道理的,因为@customer
没有
已保存,因此没有id
。
如何构建此类关联模型,然后保存/创建它们,以便:
答案 0 :(得分:2)
如果要修改关联(而不是仅从中读取),则最好在连接模型的源关联上设置:inverse_of选项。这允许构建相关记录,这些记录将在保存时自动创建适当的连接模型记录。 (参见上面的'关联加入模型'部分。)
只需将:inverse_of
添加到关系声明(has_many
,belongs_to
等),即可active_record
以正确的顺序保存模型。
答案 1 :(得分:1)
:inverse_of
。也可能有帮助。答案 2 :(得分:0)
您可以将新创建的相关模型保存在单个数据库事务中,但不能只调用save
方法。一些ORM(例如LINQToSQL和Entity Framework)可以做到,但ActiveRecord不能。只需使用ActiveRecord::Base.transaction
方法即可确保保存两个模型或不保存任何模型。有关ActiveRecord和交易的更多信息http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html