使用包含/连接

时间:2009-11-17 19:06:57

标签: ruby-on-rails ruby activerecord

我有一个Proposal模型和一个Signature模型。

提案有很多签名,签名属于提案

当我选择单个提案时,我的关系正常,但当我执行Proposal.search并返回多个提案时,我无法访问签名。

我想通过签名计算我的提案,所以我尝试了这个:

Proposal.find(:all, :limit => 3, :include => [:signatures])

现在当我调试(@proposals)时,我确实看到了相应的签名。我如何访问它们并写一个:order => signatures.count?

我对包含/加入并不是很熟悉...所以如果我以错误的方式解决这个问题,请告诉我。感谢。

3 个答案:

答案 0 :(得分:2)

为了让您熟悉使用包含与联接,请查看专用于它的Railscast。您无法通过signatures.count订购的原因是您没有选择包含该信息的列(或虚拟列)。

你会想要一个组合:select和:join来得到你想要的东西。

答案 1 :(得分:1)

我建议使用ActiveRecord的counter cache功能。在您的投标模型中添加signatures_count字段,然后您可以订购:

Proposal.find(:all, :limit => 3, :include => [:signatures], :order => 'signatures_count DESC')

查看上面链接的belongs_to API文档以获取更多详细信息。这个here上有一个较旧的Railscasts剧集。

答案 2 :(得分:1)

当您稍后需要访问签名时,将使用

:include。如果您只需要排序的相关签名计数,那么您不需要:include

我不特别喜欢以下内容,但似乎有效:

Proposal.find(:all,
              :limit => 3,
              :joins => :signatures,
              :group => 'proposals.id',
              :order => 'count(proposals.id) desc')

首先,:joins参数意味着对于每个Proposal记录,您将在输出中为每个关联的签名获得另一行。 :group参数将这些行合并为一个,但仅在:order参数根据每个proposal.id(以及签名数)的行数进行排序之后。

我怀疑有更好的方法,但这似乎有效。