Я не думаю, что вы можете сделать это чисто в одном запросе.По крайней мере, без написания чистого sql.
Но давайте попробуем найти хорошее решение в ActiveRecord
Прежде всего, давайте попробуем удалить некоторые из sql
UserAnswer.count(:conditions => ['u.anonymous = 0 AND q.id = ?', question_id], :joins => 'JOIN answers a ON user_answers.answer_id = a.id JOIN questions q ON q.id = a.question_id JOIN users u ON u.id = user_answers.user_id')
может быть переписан
UserAnswer.joins(:user).where(:users => {:anonymous => false})\
.joins(:answer => :question).where(:questions => {:id => question_id})\
.count
давайте просто сохраним эту область как магический приватный метод magic_scope
ваши текущие методы станут
def total_answers(question_id)
magic_scope(question_id).count
end
def load_stats_total(question_id)
magic_scope(question_id).count(:group => "answers.correct")
end
def load_stats_answers(question_id)
magic_scope(question_id).count(:group => "answers.id")
end
, особенно, конечно,total_answers
метод может быть получен путем суммирования результатов любого из load_stats_*
методов.
Если бы ActiveRecord был немного умнее, мы могли бы сделать
def all_the_magic(question_id)
magic_scope(question_id).count(:group => ["answers.correct", "answers.id"])
end
, что дало бынам все данные, которые нам нужны, чтобы сделать это в одном запросе.
, но, насколько я знаю, в настоящее время это невозможно.
Но я надеюсь, что это приближает вас.