我有一段简单的关系
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中的答案,等等)
发布于 2012-11-13 23:18:21
如果您使用Postgres,我会这样做
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:
Answer.order("answers.attr1 asc, answers.attr2 asc, answers.attr3 asc, ...").
limit(5).select("DISTINCT ON (answers.questionnaire_id) answers.*")发布于 2012-11-13 23:24:37
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来构建一个子查询,如下所示:
answers = Answer.arel_table
latest_answers = Answer.where(:id =>
answers.
group(:questionnaire_id).
project('max(id)')
).order('id desc').limit(5)https://stackoverflow.com/questions/13362885
复制相似问题