Rails:建立关系之间的区别
问题描述:
A doc
有很多articles
和可以有很多edits
。Rails:建立关系之间的区别
我想为每个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
存在于两个edits
和articles
在说(在伪):
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解决方案将是首选。
- 编辑:加入解释 -
这块红宝石
@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)'? –
'build'只用于has_one关系,你说doc has_many编辑,所以如何使用build编辑它应该是'@ doc.edits.create(..)'谢谢 –
'build'正常工作这种情况对我来说。 –