让我们想象一下,我经营一家假想的艺术商店,里面有几个模特(模特我指的是 Rails 术语,而不是裸体模特中的艺术术语),看起来像这样:
class Artwork < ActiveRecord::Base
belongs_to :purchase
belongs_to :artist
end
class Purchase < ActiveRecord::Base
has_many :artworks
belongs_to :customer
end
被Artwork
创建,稍后它被包含在Purchase
. 在我的create
或update
控制器方法中,Purchase
我想将新Purchase
的与现有的Artwork
.
如果Artwork
不存在,我可以做@purchase.artworks.build
or @purchase.artworks.create
,但这些都假设我正在创建一个Artwork
我不是的新的。我可以用这样的东西添加现有的艺术品:
params[:artwork_ids].each do |artwork|
@purchase.artworks << Artwork.find(artwork)
end
但是,这不是事务性的。数据库立即更新。(当然,除非我在create
控制器中,在这种情况下,我认为它可以“事务性”完成,因为@purchase
直到我调用它才存在save
,但这对我没有帮助update
。)还有@purchase.artwork_ids=
方法,但是也是即时的。
我认为这样的事情将适用于该update
动作,但它非常不雅。
@purchase = Purchase.find(params[:id])
result = @purchase.transaction do
@purchase.update_attributes(params[:purchase])
params[:artwork_ids].each do |artwork|
artwork.purchase = @purchase
artwork.save!
end
end
接下来是常规的:
if result
redirect_to purchase_url(@purchase), notice: 'Purchase was successfully updated.' }
else
render action: "edit"
end
我正在寻找的是它从另一个方向工作的方式,我可以放入accepts_nested_attributes_for
我的模型然后调用result = @artwork.save
,一切都像魔术一样工作。