2017-02-20 29 views
1

很抱歉,但我根本无法让我的头围绕这一点:如何在nil上运行第一种方法?

class Customer < ActiveRecord::Base 

    def self.first_one 
    order(:created_at).first.id 
    end 

end 

该函数返回上面的第一个客户的id如果有客户在数据库中。

但是,如果没有,它会给我一个错误,因为id不能在nil上运行。

有人可以告诉我如何更改该函数,因此即使数据库中没有任何客户,它也会返回nil

感谢您的任何帮助。

回答

4

您可以随时使用:try以避免发生错误时,一些被称为上nil

order(:created_at).first.try(:id) 

这将返回nil即使order(:created_at).first是零它不会引发任何错误

编辑

正如@Ursus建议您也可以将方法与&链接,如果您使用的是红宝石2.3.0及以上

# >= Ruby 2.3.0 
order(:created_at).first&.id 
+0

谢谢,回答我的问题。 – Tintin81

+4

从ruby 2.3.0开始,你可以执行'order(:created_at).first&.id' – Ursus

+0

只需注意,安全导航操作符('&.')只跳过'nil'但识别'false' –

2

一个更明确的版本,可能是这样的:

def self.first_one 
    first = order(:created_at).first 
    first && first.id 
end 
相关问题