首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向Rails中的关联模型添加唯一条件

如何向Rails中的关联模型添加唯一条件
EN

Stack Overflow用户
提问于 2012-11-13 22:51:22
回答 2查看 1.1K关注 0票数 1

我有一段简单的关系

Questionnaire has_many Answers

我有多份问卷。我想从不同的问卷中得到最新的5个答案。

如果我这样做了:

Answer.find(:all, :order => "id desc" , :limit => 5)

我得到了最后5个答案,但大多数情况下,所有5个答案都属于同一个问卷。如何从不同的调查问卷中查询最新的答案

Answer.find(:all, :order => "id desc" , :limit => 5, :conditions => "DISTINCT questionnaire.id") ??

(其想法是向管理员显示活动摘要,例如,用户A在2012年11月11日回复了调查问卷X中的答案,用户B在2012年1月11日回复了问卷Y中的答案,等等)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-13 23:18:21

如果您使用Postgres,我会这样做

代码语言:javascript
复制
Answer.find(:all,
  :order => "answers.attr1 asc, answers.attr2 asc, answers.attr3 asc, ..." , :limit => 5,
  :select => "DISTINCT ON (answers.questionnaire_id) answers.*")

注您可能必须在order子句中列出除了questionnaire_id之外的答题表中的每一列,这样Postgres才能确切地知道您想要选择什么,否则可能会有歧义,并且您可能会得到SQL错误。

看在上帝的份上,把升级到Rails 3吧!

Rails 3:

代码语言:javascript
复制
Answer.order("answers.attr1 asc, answers.attr2 asc, answers.attr3 asc, ...").
  limit(5).select("DISTINCT ON (answers.questionnaire_id) answers.*")
票数 2
EN

Stack Overflow用户

发布于 2012-11-13 23:24:37

代码语言:javascript
复制
latest_answer_ids = Answer.group(:questionnaire_id).
                           order('MAX(answers.id)').
                           limit(5).maximum(:id).values
latest_answers = Answer.where(:id => latest_answer_ids)

如果您需要将其作为一个查询来执行,您可以使用Arel来构建一个子查询,如下所示:

代码语言:javascript
复制
answers = Answer.arel_table
latest_answers = Answer.where(:id =>
           answers.
           group(:questionnaire_id).
           project('max(id)')
  ).order('id desc').limit(5)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13362885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档