#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