【问题标题】:find_by_id(params[:subject_id]) vs where(:id => params[:subject_id]).firstfind_by_id(params[:subject_id]) vs where(:id => params[:subject_id]).first
【发布时间】:2012-06-25 23:57:18
【问题描述】:

我是 Rails 新手。只是想知道如果找不到 subject_id,哪种方法会返回 nil 更好:

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我更喜欢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.
    

    【讨论】:

    • 我也更喜欢这个,但我的 CTO 痴迷于让 Rails 成为一种尽可能神奇的体验。怎么说服他?他很聪明
    • 我已更新答案以显示最新批准的方法。现在第 2 和第 3 方法非常相似。您应该能够说服第二种方法更好。
    【解决方案2】:

    它们都生成相同的 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,为了向前兼容,我不得不建议第二种形式。

    【讨论】:

    • 我相信如果找不到 subject_id,此方法会返回错误,而我正在查看的 2 个选项返回 nil。更新了我的问题以澄清。
    • 对于(更新的)记录:Rails 4 没有弃用 find_by_id:edgeguides.rubyonrails.org/…
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多