Я думаю, что ваши виджеты должны принадлежат_ к типу, поскольку таблица виджетов будет та, которая содержит type_id Далее я предлагаю использовать Rails counter_cache (прокрутите вниз до параметров).
Сначала вы запустите миграцию, например:
class AddTypesWidgetsCount < ActiveRecord::Migration
def self.up
change_table :types do |t|
t.integer :widgets_count
end
end
def self.down
change_table :types do |t|
t.remove :widgets_count
end
end
end
Затем добавьте атрибут :counter_cache => true
в свой метод принадлежат_.
class Widget < ActiveRecord::Base
belongs_to :type, :counter_cache => true
end
После этого вы можете создать область, которая сортирует типы по widgets_count
. Модель вашего типа может выглядеть примерно так:
class Widget < ActiveRecord::Base
has_many :widgets
named_scope :top_three, :order => 'widgets_count DESC', :limit => 3
end
Затем вы можете позвонить Type.top_three
, чтобы получить три верхних типа по количеству виджетов. Или без именованной области вы можете вызвать что-то вроде Type.find(:order => 'widgets_count DESC', :limit => 3)
, но именованная область разрешит связывание.