Student.find(:all, :conditions => [‘name = ? and status = ?’ ‘mohit’, 1])
Vs的
Student.find_all_by_name_and_status(‘mohit’, 1)
两个查询都将产生相同的行集,但第一个是优选的,因为在第二种方式中会出现异常生成的method_missing,然后rails将尝试将其作为动态方法关联。如果没有,那么结果集返回。 任何机构都能以良好的方式向我解释这一点。屏幕背后到底发生了什么?如果我错了,请纠正我。
答案 0 :(得分:2)
你是对的,第二种方式将通过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
以及其他参数。