动态查找方法Vs条件语句

时间:2010-05-23 19:41:10

标签: ruby-on-rails activerecord

Student.find(:all, :conditions => [‘name = ? and status = ?’ ‘mohit’, 1])

Vs的

Student.find_all_by_name_and_status(‘mohit’, 1)

两个查询都将产生相同的行集,但第一个是优选的,因为在第二种方式中会出现异常生成的method_missing,然后rails将尝试将其作为动态方法关联。如果没有,那么结果集返回。 任何机构都能以良好的方式向我解释这一点。屏幕背后到底发生了什么?如果我错了,请纠正我。

1 个答案:

答案 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以及其他参数。