Области применения - ваш друг.Они добавляют методы уровня класса к модели, в которой они определены. Самое лучшее в них - это то, что они могут быть цепными.
Есть много способов получить группы, о которых вы говорите, но вот что я хотел быНачните с.
class Product
# ... your code here
scope :by_sales_season, lambda {|season| where('sales_season = ?', season}
scope :by_year, lambda {|year| where('street_date >= ?' DateTime.now(year) }
# ... more of your code
end
Тогда в вашем контроллере вы можете:
@products = Product.by_year(2012).by_sales_season("spring")
Конечно, это не будет возвращаться ко всем продуктам за каждый год и / или каждыйсезон, хотя объемы могут быть изменены, чтобы сделать такую вещь, или вы можете циклически по годам и сезонам соответственно.Однако, если вы сделаете это таким образом, а не методом group_by, который является методом Enumerable
, вы не рискуете вытащить весь набор результатов в память, если вам нужен только его поднабор.