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

Vs的动态发现方法Vs的条件语句

Student.find_all_by_name_and_status(‘mohit’, 1) 

两个查询将导致相同的一组行,但第一个是在第二方式优选原因会有例外产生的method_missing然后导轨将尝试把它作为动态的方法。如果罚款,那么结果集返回。 任何机构都可以以良好的方式解释这一点。屏幕背后究竟发生了什么。如果我错了,请纠正我。

回答

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和其他参数。