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 中的答案等)

4

2 回答 2

2

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

Answer.find(:all,
  :order => "answers.attr1 asc, answers.attr2 asc, answers.attr3 asc, ..." , :limit => 5,
  :select => "DISTINCT ON (answers.questionnaire_id) answers.*")

请注意,您可能必须在 order 子句中列出答案表中的每一列,除了 questions_id 之外,以便 Postgres 可以确定您要选择什么,否则它可能会模棱两可并且您可能会收到 SQL 错误。

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

导轨 3:

Answer.order("answers.attr1 asc, answers.attr2 asc, answers.attr3 asc, ...").
  limit(5).select("DISTINCT ON (answers.questionnaire_id) answers.*")
于 2012-11-13T15:18:21.150 回答
1

使用 GROUP BY 获取每个问题的最新答案,并限制为最新的 5 个:

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)

这里的好处是子查询可以在任何 DBMS 中工作。

于 2012-11-13T15:24:36.963 回答