你是对的,第二种方式将通过method_missing
。 ActiveRecord会解析方法名称,如果它是一个有效的名称,它将会即时生成一个方法。
如果您在ActiveRecord::Base
来源看,在method_missing
你会看到开发商给我们留下的是如何生成的方法看起来像一个注释:
# 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
所以你看,通常情况归结为方法同find
。
我不会说第一种方式是可取的,因为method_missing
,因为性能损失可以忽略不计。如果你只需要根据等于某些值的属性获取记录,第二种方式会更好,效果更好。
但是,这种第二种形式不允许您进行超出平等比较的任何事情(例如,范围比较,“不等于”表达式,连接等)。在这种情况下,您只需使用find
方法和适当的conditions
和其他参数。