2015-10-24 41 views
2
if SOMETHING 
    charge = Object (this object has a method ID) 
end 

DiffObject.update_attributes(specific_attribute: charge.id) 

但很明顯,如果SOMETHING沒有評估到true然後我不需要進行任何更新,或在我的情況,我想可能更容易只是一個update_attributesspecific_attribute:nil流線型紅寶石:基於更新的對象屬性僅當對象不是零

所以我現在所擁有的是這樣運行的:

DiffObject.update_attributes(specific_attribute: ((defined? charge) == nil ? nil : charge.id))) 

但東西告訴我有這樣做

的一種更好的方式

回答

0

如果您不知道charge是否爲nil,則可以使用try安全地訪問該ID。如果收費存在,它將返回ID,如果收費爲零,沒有錯誤,則返回零。

DiffObject.update_attributes(specific_attribute: charge.try(:id)) 

方法update_attributesupdatesave等將只保存記錄,如果它實際上已經改變了,所以你並不需要檢查自己。只需保存它,讓ActiveRecord找出其餘的。

+0

yes但是在這種情況下,由於'charge'沒有被定義,所以'charge.id'會拋出一個錯誤,這就是我現在需要看到的 – james

+0

啊。在這種情況下,你可以使用'try'。將編輯我的答案。 –

+0

看到我對下面的其他答案的評論,如果'charge'沒有定義更好的 – james

0

ActiveSupport的核心擴展在幾乎每個對象上都提供了方便的方法try

嘗試(*一,& B)
調用的公共方法,其名稱都按第一個參數就像public_send做,只是如果接收方沒有對此作出迴應調用返回nil,而不是拋出一個異常。

例如,您可以使用change.try(:id)。如果changenil或某些不響應id,則返回nil,否則返回該ID。

有關詳細信息,請參閱RailsGuideRails API doc

+0

,這會引發錯誤!但我必須首先將'charge'定義爲零。有沒有辦法檢查'定義?'和'嘗試'也許一口氣? – james