仅返回此ActiveRecord查询中的唯一记录

时间:2015-12-02 23:50:22

标签: sql ruby-on-rails postgresql activerecord

我在Rails 3.2 / Postgres中有一个稍微复杂的ActiveRecord查询,它将相关最相关的文档返回到所有文档 a用户过去曾受到青睐。

问题在于,尽管指定uniq我的查询返回不同的文档记录:

 Document.joins("INNER JOIN related_documents ON 
                 documents.docid = related_documents.docid_id")
         .select("documents.*, related_documents.relevance_score")
         .where("related_documents.document_id IN (?)",    
                  some_user.favorited_documents)
         .order("related_documents.relevance_score DESC")
         .uniq
         .limit(10)

我使用RelatedDocument联接表,按照related_document.relevance_score对每个关系进行排名,我用它来排序前10个之前对查询结果进行排序。(有关架构描述,请参阅this question。)

问题在于,因为我select("documents.*, related_documents.relevance_score"),使用不同relevance_scores多次返回的同一文档记录被视为唯一结果。 (即如果该文件是多个被收藏文件的related_document。)

无论Documents如何,我如何归还唯一related_document.relevance_score

我尝试将select分成两个单独的选择,并在查询中更改uniq的位置但没有成功。

不幸的是,我必须select("related_documents.relevance_score")才能按此字段对结果进行排序。

谢谢!

更新 - 解决方案

感谢下面的 Jethroo GROUP BY是必需的补充,为我提供了以下工作查询:

 Document.joins("INNER JOIN related_documents ON 
                 documents.docid = related_documents.docid_id")
         .select("documents.*, max(related_documents.relevance_score)")
         .where("related_documents.document_id IN (?)",    
                  some_user.favorited_documents)
         .order("related_documents.relevance_score DESC")
         .group("documents.id")
         .uniq
         .limit(10)

1 个答案:

答案 0 :(得分:1)

您是否尝试按documents.docid分组http://guides.rubyonrails.org/active_record_querying.html#group