如何将现有记录添加到has_many而不立即保存到数据库?

Jim*_*oho 11 ruby-on-rails ruby-on-rails-3

假设我有这个:

class Pirate < ActiveRecord::Base
  has_many :parrots
  validates_presence_of :name
end

class Parrot < ActiveRecord::Base
  belongs_to :pirate
end
Run Code Online (Sandbox Code Playgroud)

我已经有了1到10个ids的现有海盗和鹦鹉.现在我想这样做:

p = Pirate.first
p.name = nil
p.parrot_ids = [1,2,3]
p.save if p.valid?
Run Code Online (Sandbox Code Playgroud)

因为盗版对象无效(它缺少一个名字)我不希望它被保存.然而,鹦鹉现在与海盗有关,并且它已经在数据库中提交.

如何分配鹦鹉,但是当p.save成功时,只有保存到数据库的鹦鹉的链接?也就是说,如何在一次交易中保存盗版和链接到鹦鹉?

Ken*_*enB 1

您可以稍微重新安排您的操作:

p = Pirate.first
p.name = nil
if p.save
  p.parrot_ids = [1,2,3]
end
Run Code Online (Sandbox Code Playgroud)

请注意,不需要“if p.valid?” p.保存后;因为有效?由 save 调用,确定是否尝试将数据写入数据库。

如果您的鹦鹉不是预先存在的,您可以使用 p.parrots.build(attributes={...}) 创建新的鹦鹉,在保存盗版父母之前不会保存这些新鹦鹉。

请参阅ActiveRecord::Associations::ClassMethods 文档中有关未保存对象和关联的部分。