Как написать этот SQL, используя методы чтения Rails?

#sql #ruby-on-rails #ruby #activerecord

#sql #ruby-on-rails #ruby #activerecord

Вопрос:

У меня следующая настройка:

вопрос.rb

 class Question < ActiveRecord::Base
    has_many :answers

    #validations, methods, etc
    ...

    #Returns the questions with the most answers
    def Question.top_questions(max = 10)
        sql = "SELECT question_id, COUNT('question_id') as aCount FROM answers GROUP BY question_id ORDER BY aCount DESC LIMIT #{max.to_i}" # Probably shouldn't use string interpolation here :D
        Question.connection.execute(sql)
    end
end
  

ответ.rb

 class Answer < ActiveRecord::Base
    belongs_to :question
    ...
end
  

И если я вызываю Question.top_questions() , то он возвращает это:

[{«question_id»=> 1, «aCount»=>25, 0=>1, 1=>25}, {» question_id»=>38, «Счет»=>3, 0=>38, 1=>3}, {» question_id»=>45, «aCount»=>3, 0=>45, 1=>3}, {» question_id»=>26, «Счет»=>2, 0=>26, 1=>2}, {» question_id»=> 46, «aCount»=> 2,0=>46, 1=>2}, {» question_id»=>48, «Счет»=>2, 0=>48, 1=>2}, {» question_id»=>51, «Счет»=>2, 0=>51, 1=>2}, {«question_id»=> 5, «aCount»=>1, 0=>5, 1=>1}, {» question_id»=>15, «Счет»=>1, 0=>15, 1=>1}, {» question_id»=> 20, «aCount»=>1, 0=>20, 1=>1}]

Я не уверен, как я буду использовать данные, возвращаемые в представлении, сохраняя при этом чистоту кода. Итак, мне интересно, могу ли я написать Question.top_questions() метод, используя методы чтения rails (find (), where () И т. Д.). Или как я мог бы заставить его возвращать массив объектов вопроса.

Ответ №1:

Он возвращает массив хэшей, вы можете использовать его в представлении по своему усмотрению.

Но если вы не хотите писать собственный sql, вы можете переписать его, как показано ниже.

 def self.top_questions(max = 10)
    Question.joins('LEFT JOIN answers ON questions.id = answers.question_id')
            .select('questions.*, count(answers.id) as answers_count')
            .group('questions.id')
            .order('answers_count desc')
            .limit(max)        
end