Rails中的组和子组

时间:2012-03-15 15:51:31

标签: ruby-on-rails-3

我目前正在根据发布日期对产品进行分类:

<% @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,春季,夏季和秋季。我希望进一步将这些物品分组到他们的海洋中,就像这样。年份&gt;季节&gt;产品,而不是月份&gt;产品,但分组对我来说有点太复杂了。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

Scopes是你的朋友。他们将类级方法添加到他们定义的模型中。关于它们的最好的部分是它们是可链接的。

有很多方法可以让你谈论的分组,但这就是我要开始的。

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")

当然,这不会在每年和/或每个季节都返回到所有产品,尽管范围可以修改为做这样的事情,或者你可以相应地循环多年和季节。但是,如果你这样做而不是使用Enumerable方法的group_by方法,那么当你只想要它的一个子集时,你不会冒险将整个结果集拉入内存。