6

我是新来的铁路。只是想知道如果找不到 subject_id 会返回 nil 的更好方法是什么:

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

或者

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

谢谢。

4

2 回答 2

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.
于 2012-06-26T00:51:17.003 回答
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_*_vs.的 Rails 代码可能略有不同where,但我想这与查询时间相比可以忽略不计。


编辑:鉴于Ryan Bigg 在下面的评论,我不得不建议第二种形式以实现前向兼容性。

于 2012-06-26T00:03:07.203 回答