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成功时,只有保存到数据库的鹦鹉的链接?也就是说,如何在一次交易中保存盗版和链接到鹦鹉?
您可以稍微重新安排您的操作:
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 文档中有关未保存对象和关联的部分。