简化Ruby:仅当对象不是nil

时间:2015-10-24 22:54:05

标签: ruby-on-rails ruby

if SOMETHING
  charge = Object (this object has a method ID)
end

DiffObject.update_attributes(specific_attribute: charge.id)

但很明显,如果SOMETHING未评估为true,那么我不需要更新任何内容,或者就我而言,我认为运行{可能更容易{1}} update_attributes

所以我现在所拥有的是:

specific_attribute:nil

但有些东西告诉我,有更好的方法可以做到这一点

2 个答案:

答案 0 :(得分:0)

如果您不知道charge是否为nil,则可以使用try安全地访问该ID。如果电荷存在,它将返回id,如果电荷为零,则返回nil,没有错误。

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

方法update_attributesupdatesave等只会在实际更改后保存记录,因此您无需亲自检查。只需保存它,让ActiveRecord弄清楚其余部分。

答案 1 :(得分:0)

ActiveSupport的核心扩展为几乎每个对象提供了一个方便的方法try

  

尝试(* a,& b)
  调用名称作为第一个参数的公共方法,就像public_send一样,但是如果接收者没有响应它,则调用返回nil而不是引发异常。

例如,您可以使用change.try(:id)。如果changenil或某些内容未响应id,则返回nil,否则返回ID。

有关详细信息,请参阅RailsGuideRails API doc