Я пытался связать запросы Arel с помощью областей, а не просто с использованием какой-то длинной логики, которую я написал в контроллере. Но области видимости медленнее, чем просто получить все записи и затем проанализировать их с некоторой логикой. Тогда мне интересно, почему области лучше.
Вот что я делаю:
- вопрос имеет много ответов
- ответ принадлежит одному вопросу
- вопрос имеет столбец «question_type», который я использую для его сортировки
Во-первых, путь видимости ...
в вопросе. Rb:
scope :answered, joins(:answers).order('answers.created_at desc')
scope :dogs, where(:question_type => "dogs")
scope :cats, where(:question_type => "cats")
scope :mermaids, where(:question_type => "mermaids")
in questions_controller.rb:
@dogs_recently_answered = Question.answered.dogs.uniq[0..9]
@cats_recently_answered = Question.answered.cats.uniq[0..9]
@mermaids_recently_answered = Question.answered.mermaids.uniq[0..9]
Затем в представлении я перебираю переменные экземпляра (которые теперь являются массивами, содержащими не более 10 элементов) и отображаю результаты.
Время загрузки страницы (пять раз):
Выполнено 200 OK за 535 мс (Просмотры: 189,6 мс | ActiveRecord: 46,2 мс)
Выполнено 200 OK за 573 мс (Просмотры: 186,0 мс | ActiveRecord: 46,3 мс)
Выполнено 200 OK за 577 мс (Просмотров: 189,0 мс | ActiveRecord: 45,6 мс)
Выполнено 200 OK за 532 мс (Просмотров: 182,9 мс | ActiveRecord: 46 мс)
Выполнено 200 OK за 577 мс (Просмотров: 186,7 мс | ActiveRecord: 46,9 мс)
Теперь, грязный контроллер ...
@answers = Answer.order("created_at desc")
@all_answered = []
@answers.each {|answer| @all_answered << answer.question}
@recently_answered = @all_answered.uniq
@dogs_all_answered = []
@cats_all_answered = []
@mermaids_all_answered = []
@recently_answered.each do |q|
if q.question_type == "dogs"
@dogs_all_answered << q
@dogs_recently_answered = @dogs_all_answered[0..9]
elsif q.question_type == "cats"
@cats_all_answered << q
@cats_recently_answered = @cats_all_answered[0..9]
elsif q.question_type == "mermaids"
@mermaids_all_answered << q
@mermaids_recently_answered = @mermaids_all_answered[0..9]
end
end
А вот время загрузки страницы (пять раз):
Выполнено 200 OK за 475 мс (Просмотров: 196,5 мс | ActiveRecord: 34,5 мс)
Выполнено 200 OK за 480 мс (Просмотры: 200,4 мс | ActiveRecord: 36,4 мс)
Выполнено 200 OK за 434 мс (Просмотры: 198,2 мс | ActiveRecord: 35,8 мс)
Выполнено 200 OK за 475 мс (Просмотров: 194,2 мс | ActiveRecord: 36,4 мс)
Завершено 200 OK за 475 мс (Просмотры: 195,0 мс | ActiveRecord: 35,4 мс)
Итак ...
Помимо читабельности, что можно выиграть, оттачивая запрос с областью? Становится ли это быстрее, когда появляется больше записей?