【问题标题】:DRY instance variables for similar find queries类似查找查询的 DRY 实例变量
【发布时间】:2011-09-12 13:33:32
【问题描述】:

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

我有一个页面,其中包含从 A 到 Z 的服装品牌列表,其中有一个 each 块来遍历它们。我想按字母拆分这个列表,并在顶部有一个从 A 到 Z 的链接行,每个字母从页面向下跳到列表中的字母。但是,为了做到这一点,我只能考虑为每个字母创建一个 each 循环,在它旁边加上 <A NAME="A"> 等,并为每个字母创建一个实例变量。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这样的东西对你有用吗?

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

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

    【讨论】:

    • 哇,是的!没想到这么简洁的代码,非常感谢!
    【解决方案2】:
    # 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 次。

    【讨论】:

    • 你的意思是@brands = Hash.new { |h,k| h[k] = [] }?否则,您的所有列表都是相同的实例,最终将包含所有产品。还是我错过了什么?
    • 你是对的,我相信它会产生一个新的数组副本。谢谢指正!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 2014-12-26
      • 2014-12-26
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2014-01-26
      相关资源
      最近更新 更多