find_by_id(params [:subject_id])vs where where(:id => params [:subject_id])。first

时间:2012-06-25 23:57:19

标签: ruby-on-rails ruby-on-rails-3.2

我是铁杆新手。只是想知道哪个是更好的方法,如果找不到subject_id,将返回nil:

@subject = Subject.find_by_id(params[:subject_id])

@subject = Subject.where(:id => params[:subject_id]).first

感谢。

2 个答案:

答案 0 :(得分:9)

我更喜欢find_by,因为名称是描述性的,您无需调用第二个函数即获得对象(即first

User.find(9)             # returns User object. Throws exception when not found.    
User.find_by(id: 9)      # returns User object. Returns nil when not found.    
User.where(id: 9).first # returns User object. Returns nil when not found.

答案 1 :(得分:4)

它们都生成相同的SQL语句:

1.9.3p194 :003 > Example.find_by_id(9)
  Example Load (0.3ms)  SELECT "examples".* FROM "examples" WHERE "examples"."id" = 9 LIMIT 1
nil
1.9.3p194 :004 > Example.where(:id => 9).first
  Example Load (0.3ms)  SELECT "examples".* FROM "examples" WHERE "examples"."id" = 9 LIMIT 1
nil

因此,它们在数据库中具有相同的性能特征。 find_by_*_where的Rails代码可能略有不同,但我认为与查询时间相比可以忽略不计。


修改:根据Ryan Bigg's comment below,我必须建议第二种形式以实现向前兼容。