我目前正在根据发布日期对产品进行分类:
<% @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;产品,但分组对我来说有点太复杂了。有什么想法吗?
答案 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方法,那么当你只想要它的一个子集时,你不会冒险将整个结果集拉入内存。