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.