сортировка ассоциаций

#ruby-on-rails

Вопрос:

У меня есть 3 модели дедушка, Папа, Малыш

 GrandPa => has_many :pas
Pa => has_many kids, :polymorphic => true #dont ask why
 

Когда я перечисляю дедушку, я хотел бы представить следующее


1 — Имя дедушки

2 — Список ООПТ, отсортированных по количеству детей в каждом ООПТ в порядке убывания


Как мне выполнить #2?

Спасибо

Ответ №1:

Попробуйте это:

 GrandPa.all do |gpa|
 p gpa.name
 gpa.pas.all(:joins => :kids, :select => "pas.*, count(pas.id) AS kid_count"
       :group => :id, :order => "kid_count DESC") do |pa|
   p "#{pa.name} : #{pa.kid_count}"
 end
end
 

Используйте подход, приведенный ниже, если вы хотите загрузить родителей и детей.

 GrandPa.all(:include => {:pas => :kids}) do |gpa|
  p gpa.name
  gpa.pas.sort_by{|pa| pa.kids.size}.reverse_each do |pa|
    p "#{pa.name} : #{pa.kids.size}"
    pa.kids do |kid|
      p kid.name
    end
  end
end
 

Комментарии:

1. Отлично. Работает как заклинание. Всего одно небольшое количество изменений(pas.id) в 3-й строке. Лучше ли это сделать с помощью этого небольшого sql-кода или в целом вы получаете лучшую производительность с помощью этого синтаксиса sql? Спасибо!

2. Это эффективное решение, если вы НЕ хотите загружать детей для каждого родителя. В противном случае посмотрите на второе представленное решение.