如何重构此代码以使其更清晰( ruby on rails )?

How to refactor this code to make it cleanner ( ruby on rails )?

我想在 rails 上重构 ruby 中的代码。

在Order.rb我有:

def self.filter_price range
    case range.to_sym
    when :highest
      self.where("price > 10000")
    when :higher
      self.where(price: 5001..10000)
    when :high
      self.where(price: 1001..5000)
    when :low
      self.where(price: 501..1000)
    when :lower
      self.where(price: 1..500)
    when :lowest
      self.where(price: [0,nil])
    else
      self
    end
  end

在观点上,我有这个苗条html:

    - price_range = [ [0,nil,"lowest"], [1,500,"lower"], [501,1000,"low"], [1001,5000,"high"], [5001,10000,"higher"], [10000,">","highest"] ] 
    - (0..5).each do |i|
      tr
        - if i == 0
          th= "#{i}"
        - else
          th= "#{price_range[i][0]} - #{price_range[i][1]}"
        td.text-right= Order.filter_price(price_range[i][2]).count
          span.divider
          = with_unit (Order.filter_price(price_range[i][2]).count.to_f / Order.count.to_f * 100.0).to_i, "%"
        td.text-right
          = Order.filter_price(price_range[i][2]).select{|o| o.replied?}.count
          span.divider
          = with_unit (Order.filter_price(price_range[i][2]).select{|o| o.replied?}.count.to_f / Order.all.select{|o| o.replied?}.count.to_f * 100.0).to_i, "%"
          span.divider
          = with_unit (Order.filter_price(price_range[i][2]).select{|o| o.replied?}.count.to_f / Order.filter_price(price_range[i][2]).count.to_f * 100.0).to_i, "%"
        td.text-right
          = Order.paid.filter_price(price_range[i][2]).count
          span.divider
          = with_unit (Order.paid.filter_price(price_range[i][2]).count.to_f / Order.paid.count.to_f * 100.0).to_i, "%"
          span.margin

我怎样才能删除 price_range 数组以使代码更清晰并仍然获得相同的输出结果?

任何人都可以帮我解决这个问题,在此先感谢。

以下是将在视图中看到的内容:

| Price  | request |      reply      | Paid  |
----------------------------------------------
|   0    |   68    | 19/15%/27%      |  5/6% |
---------------------------------------------
|1 - 500 |   19    | ....            | ....  |
----------------------------------------------
|....    |  ....   |  ....           | ....  |

上面的html代码用于遍历每一行。

您可以将 price_range 定义为散列: price_range = {lowest: '0', low: '1 - 500', high: '1 - 500', higher: '1 - 500', highest: '10000 >'}

然后你可以循环调用Order.filter_price(price_range.keys[0]) # lowest等等

th= "#{price_range[i][0]} - #{price_range[i][1]}"

可以写成

th= "#{price_range.values[i]}" # if i = 1 then price_range.values[0]: "1 - 500"

您也可以将 order.rb 修改为 return [Order.filter_price(price_range[i][2]).count, Order.filter_price(price_range[i][2]).select{|o| o.replied?}]同时。这将进一步清理您的代码。