2009-04-02 13 views
4

Un __gVirt_NP_NN_NNPS<__ idiome commun que mon camp utilise dans des rails est comme suit:refactoring Modèle Méthodes en 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 

comment puis-je faire de ce mieux/plus rapide/plus forte?

thx

C

Répondre

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

Si vos choses sont des modèles ActiveRecord et vous avez seulement besoin des éléments sélectionnés pour votre objectif actuel, vous pouvez, si vous utilisez Rails 2.0 (? Certainement 2.1) ou ci-dessus, trouvez named_scope s utile.

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

Vous pouvez dire

Thing.rightness(123) 

, qui est (dans ce cas) similaire à

Thing.find_by_attribute(123) 

en ce qu'elle se résume à une requête SQL, mais il est plus facilement chainable pour modifier le SQL. Si cela vous est utile, ce qui n'est peut-être pas, bien sûr ...