Rails另类救援计划

时间:2016-09-22 03:14:07

标签: ruby-on-rails ruby

我读过一些文章称rails rescue会导致性能问题。 例如

a = Course.where(id: 20).first #better
a = Course.find(20) rescue nil #worse

那么如何以最佳方式重写以下代码

parent_section = parent_section.section rescue nil

我试过这个

parent_section = parent_section.section if parent_section.section.present?

它工作正常,但我觉得它太长而且很乱。 有没有更好的方法来实现这一目标?

更新

如果代码是

parent_section_id = parent_section.section.id rescue nil

如何重写它?

2 个答案:

答案 0 :(得分:3)

如果这只是一个Active Record关联,那么当您在section上调用parent_section时,它不会引发任何异常。如果没有一个部分,它将自然返回nil,因此您根本不需要rescue。您应该能够用以下代码替换您的代码:

parent_section = parent_section.section

如果你想在结果上调用某些内容(例如id),那么你可以使用try - 只会在事件不为零的情况下调用命名的方法,例如:

parent_section_id = parent_section.section.try(:id)

答案 1 :(得分:1)

如果您想获得id部分的nil,可以使用try来查看nil <{1}}

parent_section_id = parent_section.section.try(:id)