의 내가 몇 가지 모델을 가상의 예술 상점을 실행 (및 모델에 의해 내가 레일 용어되지 누드 모델로 예술 용어 말하는 겁니다)이 같이 보입니다 가정 해 봅시다 :레일 : 기존 모델에 has_many 연관을 트랜잭션 방식으로 추가하려면 어떻게해야합니까?
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
또는 @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
이
종래 다음과 같다 : 내가 무엇을 찾고 있어요 것은 그것이 내가 내 모델에서accepts_nested_attributes_for
을 넣어 수있는 다른 방향에서 작업하는 방법과 같은 것을
if result
redirect_to purchase_url(@purchase), notice: 'Purchase was successfully updated.' }
else
render action: "edit"
end
입니다 result = @artwork.save
으로 전화하면 모든 것이 마술처럼 작동합니다.
두 번째 생각 '= hidden_field_tag'구매 [artwork_ids] [] "는 효과가있는 것처럼 보입니다. – Geoff
방금 전 Railkeet 17이라는 것을 깨달았습니다. 전에도 보았지만, HABTM을 사용했기 때문에 잊어 버린 것 같습니다. – Geoff