2

我有两个模型:

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.customernil。不知何故,这是有道理的,因为@customer没有被保存,因此没有id.

如何构建此类关联模型,然后保存/创建它们,以便:

  • 如果模型无效,则不会保留任何模型,
  • 错误可以在一个列表中读出,而不是结合所有模型的错误消息,
  • 并保持我的代码简洁?
4

3 回答 3

2

来自rails api 文档

如果要修改关联(而不仅仅是从中读取),那么最好在连接模型的源关联上设置 :inverse_of 选项。这允许构建关联的记录,这些记录将在保存时自动创建适当的连接模型记录。(请参阅上面的“关联加入模型”部分。)

因此,只需添加:inverse_of到关系声明(has_manybelongs_to)即可以active_record正确的顺序保存模型。

于 2013-09-25T12:46:11.373 回答
1
  • 我想到的第一件事就是摆脱这种验证。
  • 想到的第二件事-首先保存客户,然后他们建立联系。
  • 第三件事::inverse_of在声明关系时使用。可能也有帮助。
于 2013-09-25T11:12:31.267 回答
0

您可以将新创建​​的相关模型保存在单个数据库事务中,但不能通过单个save方法调用。一些 ORM(例如 LINQToSQL 和实体框架)可以做到,但 ActiveRecord 不能。只需使用ActiveRecord::Base.transaction方法来确保两个模型都已保存或都不保存。更多关于 ActiveRecord 和事务的信息在这里http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

于 2013-09-25T11:19:18.000 回答