首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Streamline Ruby:仅当对象不为空时才基于对象属性进行更新

Streamline Ruby:仅当对象不为空时才基于对象属性进行更新
EN

Stack Overflow用户
提问于 2015-10-25 06:54:05
回答 2查看 59关注 0票数 2
代码语言:javascript
复制
if SOMETHING
  charge = Object (this object has a method ID)
end

DiffObject.update_attributes(specific_attribute: charge.id)

但是很明显,如果SOMETHING的计算结果不是true,那么我不需要更新任何东西,或者在我的例子中,我认为只使用specific_attribute:nil运行update_attributes可能会更容易

所以我现在所拥有的是:

代码语言:javascript
复制
DiffObject.update_attributes(specific_attribute: ((defined? charge) == nil ? nil : charge.id)))

但我的直觉告诉我有更好的方法

EN

回答 2

Stack Overflow用户

发布于 2015-10-25 07:03:20

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

代码语言:javascript
复制
DiffObject.update_attributes(specific_attribute: charge.try(:id))

方法update_attributesupdatesave等只会保存实际发生更改的记录,所以您不需要自己检查。只需保存它,让ActiveRecord解决剩下的问题即可。

票数 0
EN

Stack Overflow用户

发布于 2015-10-25 08:41:30

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

尝试(*a,&b)

调用名字作为第一个参数的公共方法,就像public_send一样,不同的是,如果接收器不响应它,调用将返回nil,而不是引发异常。

例如,您可以使用change.try(:id)。如果changenil或不响应id的值,则返回nil,否则返回ID。

详细信息请参见RailsGuideRails API doc

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33324213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档