2013-06-24 142 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)'? –

相关问题