我正在为用户填写一份调查问卷。用户可以多次回答每个问题。响应有一个 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
我确实想出了一个 SQL 查询,它可以满足我的需求,在进行 GROUP BY 之前对行进行排序。是否有合理的方法在 Response::current 中使用它?
SELECT *
FROM (
SELECT *
FROM responses
WHERE user.id = 6
ORDER BY created_at DESC ) as user_responses
GROUP BY question_key