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 年 11 月 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 句の question_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)

これを 1 つのクエリとして実行する必要がある場合は、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 に答える