rails compact array和NilClass

时间:2015-07-27 01:28:39

标签: arrays ruby ruby-on-rails-4

  • 我的客户端模型带有日期字段:last_issue
  • 客户 has_many:门票门票有日期字段:invoice_date
  • 客户 has_many:广告广告有日期字段:issue_date

我正在尝试使用带有压缩的数组来查找并显示客户端显示视图中这3个项目的最大日期,但是当客户端执行此操作时出现错误没有票证或广告。

当我尝试在视图中显示最大日期时使用:
[@client.last_issue, @client.adverts.max.issue_date, @client.tickets.max.invoice_date].compact.max
只要客户端缺少其中一个关联模型,它就会失败。

我知道compact会删除nil元素,但是我会用最干净的方式处理来自Nil关联的缺失值导致NoMethodError: undefined method 'issue_date' for nil:NilClass

等错误

2 个答案:

答案 0 :(得分:1)

作为一件事,你可以做到这一点。

[@client.try(:last_issue), @client.try(:adverts).try(:max).try(:issue_date), @client.try(:tickets).try(:max).try(:invoice_date)].compact.try(:max)

您是否考虑过这样做,以便您没有深入到其他对象?这样您只需要向客户发送1条消息,以获取最大发票和发行日期吗?

答案 1 :(得分:1)

根据您的描述,您只想显示三种类型的对象client.last_issue,client.adverts和client.tickets的最大日期。然后保存您的应用程序资源,不要实例化故障单和广告。 而是使用聚合加载普通的最大日期,如:

[
 @client.last_issue, 
 @client.adverts.maximum(:issue_date),
 @client.tickets.maximum(:invoice_date)
].compact.max

您确实希望将该代码段移动到装饰器中。 除此之外,我不确定是否真的意味着期望最小日期(意味着最早的日期),尽管你要求最大日期。