2012-04-10 3 views
11

그래서 저는 레일스 초보자이며 꽤 일반적인 문제가 될 수 있다고 생각합니다.하지만 여기에서 답을 찾을 수 없습니다. 푸 belongs_to레코드를 저장하기 전에 연관을 생성하십시오.

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

바, 작동 모든 :

은 내가 이런 모델 Foo 있습니다. 이제 Foo를 만들고 동시에 Bar를 만들고 싶습니다. 좋아요 :

f = Foo.new(:baz => 'baz') 
bars.each do |b| 
    f.bars.build(:bizzy => b[:bizzy]) 
end 
f.save 

부모 레코드가 없기 때문에 이것이 작동하지 않는다는 것을 알고 있으므로 연관성이 없지만이를 수행 할 수있는 방법이 있어야합니다. 이 문제를 임시적으로 수정했습니다.

f = Foo.new(:baz => 'baz') 
f.save 
f = Foo.find(:first, :conditions => {:baz => 'baz'}) 
bars.each do |b| 
    f.bars.create(:bizzy => b[:bizzy]) 
end 

하지만 깨끗하지는 않으며 불쾌감을 줄 수 있습니다.

어떻게해야할까요?

답변

10

첫 번째 줄에서는 new 대신 create을 사용할 수 있습니다. bar 개체가 이미 있기 때문에 f.bars.create 또는 f.bars.build이 필요하지 않습니다. 나는 이런 짓을 했을까 :

f = Foo.create(:baz => 'baz') 

bars.each do |b| 
    f.bars << b 
end 

개인적으로 나는 bars 반복하지,하지만 단지 update_all를 사용

f = Foo.create(:baz => 'baz') 
bars.update_all(:foo_id => f.id) 

편집 : 먼저 기록을 저장하지 않고이 작업을 수행 할 수 있습니다. 이 작품은 나를 위해 :

f = Foo.new(:baz => 'baz') 

bars.each do |b| 
    f.bars << b 
end 

f.save 
+0

허, 나는 그것이 불가능하다고 맹세했습니다. 당신이 맞습니다, 내가 다시 테스트 한 후에 그것은 매력처럼 작동했습니다. 감사! – Eugene

+1

같은 문제에 빠져 마지막 옵션 (f = Foo.new)에서 Bar 모델 (내 코드에서)에서': foo_id, remove : presence => true'를 제거해야한다는 것을 깨달았습니다. – migu

관련 문제