2017-02-20 30 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 
相關問題