Возможно, вы захотите поразить двух зайцев одним выстрелом (у другого - производительность), используя столбец счетного кэша в модели продукта. Например, скажем, вы совершаете продажу для продукта X. Когда эта продажа фиксируется в базе данных, она запускает обратный вызов, чтобы увеличить количество продаж для этого продукта в строке продукта в базе данных. Когда вы уничтожаете, это наоборот уменьшает количество продуктов.
Вам необходимо настроить столбец кэша в таблице продуктов. В новой миграции сделайте это:
add_column :products, :sales_count, :integer, default => 0
Product.reset_column_information
Product.all.each do |product|
Product.update_counters(product.id, :sales_count => product.sales.length
end
Вам также необходимо внести некоторые изменения в свои модели Product и Sale, например:
class Product < ActiveRecord::Base
has_many :sales
end
class Sale < ActiveRecord::Base
belongs_to :product, :counter_cache => true
end
Тогда вместо того, чтобы загружать все торговые ассоциации (которые в большом приложении были бы коварными), вы просто загружаете продукт, и у вас будет количество связанных продаж в самой строке , за часть стоимости исполнения.
Надеюсь, это поможет!