2009-04-02 11 views
4

Ein gemeinsames Idiom, das mein Lager in Schienen verwendet, ist wie folgt:Refactoring Modell Methoden in Ruby On Rails

def right_things(all_things, value) 
    things = [] 
    for thing in all_things 
     things << thing if thing.attribute == value 
    end 
    return things 
end 

wie kann ich das besser/schneller/stärker?

thx

-C

Antwort

13
def right_things(all_things, value) 
    all_things.select{|x| x.attribute == value} 
end 
1

Wenn Sie Ihre Sachen Active Modelle sind, und Sie müssen nur die Elemente für den aktuellen Zweck ausgewählt, können Sie, wenn Sie mit Rails 2.0 (? Auf jeden Fall 2.1) oder höher, finden Sie named_scope s nützlich.

class Thing 
    named_scope :rightness, lambda { |value| :conditions => ['attribute = ?', value] } 
end 

So kann man sagen,

Thing.rightness(123) 

, die (in diesem Fall) ist ähnlich wie

Thing.find_by_attribute(123) 

, dass es zu einer SQL-Abfrage läuft darauf hinaus, aber es ist leichter verkettbar um das SQL zu ändern. Wenn das für Sie nützlich ist, was es natürlich nicht sein kann ...