1

ユーザーが記入するアンケートに取り組んでいます。ユーザーは各質問に何度も答えることができます。回答には、質問とペアにする question_key があります。ユーザーが作成したすべての応答を取得せずに、ユーザーの現在の応答の完全なセットを取得したいと考えています。

応答テーブルは次のようになります。

create_table "responses", :force => true do |t|
  t.string   "question_key", :null => false
  t.text     "value",        :null => false
  t.integer  "user_id",      :null => false
  t.datetime "created_at"
  t.datetime "updated_at"
end

応答クラスの関連部分は次のとおりです。

class Response < ActiveRecord::Base
  def self.current
    recent.uniq {|response| response.question_key}
  end

  scope :recent, order('created_at DESC')
end

user.responses.current一連の応答を取得しますが、実際には非効率的です。ユーザーがこれまでに作成したすべての応答を取得し、一意の値ごとに最新のものを除くすべてを破棄していますquestion_key

GROUP BY を実行する前に行を並べ替えて、必要なことを行う SQL クエリを見つけました。これを Response::current で使用する合理的な方法はありますか?

SELECT *
FROM (
    SELECT *
    FROM responses
    WHERE user.id = 6
    ORDER BY created_at DESC ) as user_responses
GROUP BY question_key
4

2 に答える 2

0

groupメソッドを使用して、アクティブなレコードでグループ化を実行できます。

Responses.where(user_id: '123').order('created_at DESC').group('question_key')

したがって、コードは次のようになります。

class Response < ActiveRecord::Base
  scope :recent, order('created_at DESC')
  def self.current
    recent.group('question_key')
  end
end
于 2013-11-02T00:46:58.290 に答える