如何重构此代码以使其更清晰( 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?}]
同时。这将进一步清理您的代码。
我想在 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?}]
同时。这将进一步清理您的代码。