Группы и подгруппы в Rails - PullRequest
1 голос
/ 15 марта 2012

В настоящее время я сортирую продукты по дате выпуска следующим образом:

<% @product_months.each do |month, products| %>
<h2><%= month.strftime("%B %Y") %></h2>
  <% products.each do |product| %>
    <p><b><%= product.title %></b> on <%= product.street_date.to_date.to_s(:long) %></p>
  <% end %>
<% end %>

В контроллере:

    @products = Product.where('street_date > ?', Date.today).order('street_date ASC')
    @product_months = @products.group_by { |t| t.street_date.beginning_of_month }

Продукты, однако, также сгруппированы в три sales_seaons, весна, лето и осень.Я бы хотел еще больше сгруппировать предметы по морям, вот так.Год> Сезон> Продукт, а не Месяц> Продукт, но группировка оказывается слишком сложной для меня.Есть мысли?

1 Ответ

3 голосов
/ 15 марта 2012

Области применения - ваш друг.Они добавляют методы уровня класса к модели, в которой они определены. Самое лучшее в них - это то, что они могут быть цепными.

Есть много способов получить группы, о которых вы говорите, но вот что я хотел быНачните с.

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, вы не рискуете вытащить весь набор результатов в память, если вам нужен только его поднабор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...