2013-06-24 45 views
2

A doc有很多articles可以有很多editsRails:建立關係之間的區別

我想爲每個article構建一個edit,總數最多爲@doc.articles。此代碼適用於第一個版本(即,尚未存在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,仍然建立在@doc.articles總,如果只有一個article改變了太多edits和一些重複結束了。

我想提出一些條件對:article_id存在於兩個editsarticles在說(在):

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關係,你說doc has_many編輯,所以如何使用build編輯它應該是'@ doc.edits.create(..)'謝謝 –

+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'方法(它通過使用'&'字符執行此操作)。你可以把「to_proc」方法非常類似於這樣:

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

在Ruby中,塊和特效通常是等價的(kindof),所以這個作品!

+0

這工作*完美*。非常感謝。我不認爲你可以解釋它的作用:'... map(&:article)'? –