2016-05-23 5 views
0

Ich möchte meinen Code in Ruby auf Schienen umgestalten.Wie umgestalten Sie diesen Code, um ihn sauberer zu machen (Ruby on Rails)?

In Order.rb ich habe:

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 

In Ansichten, ich habe diese schlanke 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 

Wie kann ich price_range Array entfernen Sie den Code sauberer zu machen und immer noch die gleiche Ausgabeergebnis?

Kann mir jemand helfen, danke im Voraus.

Hier ist, was in den Ansichten sehen:

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

Der HTML-Code, oben ist durch jede Zeile für Looping.

+0

Was wird schließlich in der Ansicht gerendert? Können Sie ein Beispiel geben? – tekina

Antwort

1

Sie price_range als Hash definieren: price_range = {lowest: '0', low: '1 - 500', high: '1 - 500', higher: '1 - 500', highest: '10000 >'}

können Sie dann Order.filter_price(price_range.keys[0]) # lowest anrufen und so weiter in einer Schleife

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

dann als

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

geschrieben werden konnte

Sie könnten auch Ändern Sie order.rb, um beide [Order.filter_price(price_range[i][2]).count, Order.filter_price(price_range[i][2]).select{|o| o.replied?}] zur gleichen Zeit zurückzugeben. Dies wird Ihren Code weiter aufräumen.

+0

Danke. Ausgezeichnet! Aber ist es gut, wenn wir eine Methode im Order.rb-Modell machen, die so viele Aufgaben erledigt? –

+0

Und wie kann ich alle Zahlen an einem Ort, für die Wiederverwendung, also wenn ich die Nummer ändern, kann ich nur an einem Ort statt 2 Plätze ändern. Die Zahlen, die ich meine, sind '[' 0 ',' 1 - 500 ',' 501 - 1000 '...] '. Derzeit, wenn ich die Zahlen ändern, muss ich beide in der Hash ** Preisbereich ** und ** Filterpreis ** -Methode im Order.rb-Modell ändern. –