2013-06-24 3 views
2

doc은 많은 articles을 가질 수 있습니다.은 다수가 edits입니다.레일 : 관계 간의 차이를 위해 구축

@doc.articles까지 각 article에 대해 edit을 만들고 싶습니다. 이 코드는 첫 번째 빌드에서 작동합니다 (즉, edits이없는 경우).

def editing 
    @doc = Doc.find(params[:id]) 
    unbuilt = @doc.articles - @doc.edits 
    unbuilt.reverse.each do |article| 
    @doc.edits.build(:body => article.body, :article_id => article.id, :doc_id => @doc.id) 
    end 
end 

그러나 edits 이미 그 edits 유지하고 여전히 하나의 article가 변경된 경우 너무 많은 edits 일부 중복와 함께 끝나는 @doc.articles 총 세우겠다 존재하는 경우.

나는 (의사에) 모두 edits과의 articles 대답에 존재 :article_id에 대해 어떤 조건을 넣어하려면 :

unbuilt = @doc.articles - @doc.edits 
unbuilt.where('article_id not in (?)', @doc.edits).reverse.each do |article| 
    @doc.edits.build(...) 
end 

어떤 도움이 우수 할 것입니다! 정말 고맙습니다. 당신은 여기에서 뭔가 이상한 일을

+0

'build'는 오직 has_one 관계에만 사용되었습니다. 당신은 그 문서가 has_many를 편집한다고 말했고, 어떻게 편집을 위해'@ doc.edits.create (..) '가 되어야만합니까? Thanks –

+0

'build'는 잘 작동합니다 나를위한이 사건. –

답변

2

:

unbuilt = @doc.articles - @doc.edits 

을 당신은 아마이 대신

unbuilt = @doc.articles - @doc.edits.map(&:article) 

이 작동 할 경우 @ doc.articles 및 doc.edits 작은 모음입니다 @, 그렇지 않으면 SQL 솔루션 선호 될 것이다.

- 편집 : 추가 설명 -

루비

@doc.edits.map(&:article) 

의이 작품은

@doc.edits.map do |edit| edit.article end 

이전이 훨씬 더 컴팩트하고 동일합니다은에 도입 된 기능을 활용 루비 1.9

기본적으로 기호 (: 문서)를 사용하고, 'to_proc'메소드 ('&'문자를 사용하여이를 수행합니다).

def to_proc 
    proc { |object| object.send(self) } 
end 

루비에서 블록 및 발동은 일반적으로 (벽돌 쌓는) 동일하므로이 작동 :이 매우 비슷한으로 'to_proc'방법을 생각할 수 있습니다!

+0

그건 완벽하게 * 일했습니다. 정말 고맙습니다. 나는 이것이 당신이 무엇을하는지 설명 할 수 있다고 가정하지 않는다 :'... map (& : article)'? –