我有一个Proposal模型和一个Signature模型。
提案有很多签名,签名属于提案
当我选择单个提案时,我的关系正常,但当我执行Proposal.search并返回多个提案时,我无法访问签名。
我想通过签名计算我的提案,所以我尝试了这个:
Proposal.find(:all, :limit => 3, :include => [:signatures])
现在当我调试(@proposals)时,我确实看到了相应的签名。我如何访问它们并写一个:order => signatures.count?
我对包含/加入并不是很熟悉...所以如果我以错误的方式解决这个问题,请告诉我。感谢。
答案 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(以及签名数)的行数进行排序之后。
我怀疑有更好的方法,但这似乎有效。