2010-05-23 4 views
2
Student.find(:all, :conditions => [‘name = ? and status = ?’ ‘mohit’, 1]) 

Vsdynamique trouver des méthodes Vs déclarations conditionnelles

Student.find_all_by_name_and_status(‘mohit’, 1) 

Les deux requêtes résulteront le même ensemble de la ligne, mais première est la cause préférable de la seconde manière, il y aura method_missing généré d'exception et Rails essayer de le relier comme méthode dynamique. si c'est bien, le résultat est retourné. Est-ce que n'importe quel corps peut m'expliquer cela d'une bonne manière. Qu'est-ce qui se passe exactement derrière l'écran. S'il vous plait corrigez moi si je me trompe.

Répondre

2

Vous avez raison, la seconde voie passera par un method_missing. ActiveRecord analysera le nom de la méthode et s'il s'agit d'un nom valide, il générera une méthode à la volée.

Si vous regardez dans la source de ActiveRecord::Base, dans method_missing vous verrez que les développeurs nous ont laissé un commentaire de la façon dont cette méthode produit ressemblerait à ceci:

# def self.find_by_login_and_activated(*args) 
# options = args.extract_options! 
# attributes = construct_attributes_from_arguments(
#  [:login,:activated], 
#  args 
# ) 
# finder_options = { :conditions => attributes } 
# validate_find_options(options) 
# set_readonly_option!(options) 
# 
# if options[:conditions] 
#  with_scope(:find => finder_options) do 
#  find(:first, options) 
#  end 
# else 
#  find(:first, options.merge(finder_options)) 
# end 
# end 

Donc, vous voyez que, généralement, cela se résume à la même méthode find.

Je ne dirais pas que la première façon est préférable à cause de method_missing, parce que la pénalité de performance pour cela est négligeable. La deuxième façon se lit mieux et fonctionne bien si vous avez juste besoin d'aller chercher des enregistrements basés sur des attributs égaux à certaines valeurs. Cependant, cette deuxième forme ne vous permet pas de faire quoi que ce soit au-delà de la comparaison d'égalité (par exemple, comparaison de gamme, expressions "non égales", jointures, etc.). Dans de tels cas, il vous suffira d'utiliser la méthode find avec les paramètres conditions appropriés.

Questions connexes