类似查找查询的DRY实例变量

时间:2011-09-12 13:33:33

标签: ruby-on-rails ruby ruby-on-rails-3 dry

也许这个问题可能已经得到解答,但我不确定要搜索什么。

我有一个带有A到Z服装品牌列表的页面,每个块都有一个迭代它们的所有块。我想通过字母拆分这个列表,并在顶部有一行A到Z的链接,每个字母从页面向下跳到列表中的字母。但是,为了做到这一点,我只能考虑为每个字母创建一个每个循环,旁边有<A NAME="A">等,每个字母都有一个实例变量。

我的问题是,如何在控制器中避免使用26个不同的实例变量?

@Abrands = Product.where('brand LIKE ?', "A%")
@Bbrands = Product.where('brand LIKE ?', "B%")
@Cbrands = Product.where('brand LIKE ?', "C%")
etc.

这显然不是很干,有没有更好的方法可以做到这一点?我仍然用铁轨找到我的脚,任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:2)

这样的事情对你有用吗?

@products = Product.all.group_by{|product| product.brand.slice(0,1)}

这是一个很好的单行,只会发出1个查询。它会产生类似于其他用户建议的哈希值。

答案 1 :(得分:1)

# Hash initialization to empty arrays
@brands = Hash.new { |h,k| h[k] = [] }

Product.all.each do |product|
  @brands[product.brand[0].upcase.to_sym] << product
end

返回这样的哈希:

{:A => [products for brands A*], :B => [products for brands B*], ...}

此方法的优点是只执行一个查询而不是26个。

答案 2 :(得分:0)

这个openrailscasts剧集对你有帮助吗? Non Active Record (Products by Letter)