Rails:构建关系之间的差异
doc
有很多articles
, 可以有很多edits
。
我想为每篇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
被更改,最终@doc.articles
太多的edits
和一些重复。
我想提出一些条件:article_id
,它存在于edits
和articles
中(以伪代码forms ):
unbuilt = @doc.articles - @doc.edits unbuilt.where('article_id not in (?)', @doc.edits).reverse.each do |article| @doc.edits.build(...) end
任何帮助都会很棒! 非常感谢。
你在做一些奇怪的事情:
unbuilt = @doc.articles - @doc.edits
你可能想要这个
unbuilt = @doc.articles - @doc.edits.map(&:article)
如果@ doc.articles和@ doc.edits是小型集合,则此方法有效,否则首选SQL解决方案。
– 编辑:补充说明 –
这件Ruby
@doc.edits.map(&:article)
相当于
@doc.edits.map do |edit| edit.article end
前一个更紧凑,并利用ruby 1.9中引入的function
它基本上采用符号(:article),在其上调用’to_proc’方法(它通过使用’&’字符来实现)。 您可以将’to_proc’方法视为与此非常类似的方法:
def to_proc proc { |object| object.send(self) } end
在ruby中,块和触发器通常是等价的(有点),所以这是有效的!