在sort_by中使用属性条件来捕获零值?

时间:2015-10-26 21:19:33

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

我有以下一行来计算一名球员在俱乐部的天数:

Player.where(:current_player => false).sort_by {|p| p.departures.first.departure_date - p.arrivals.first.arrival_date}

这适用于非现有玩家。但是,我想不仅包括前球员,还包括现在的球员。我想与Player.where(:current_player => false)交换Player.all,但sort_by显然会抓住一堆空(因为当前玩家没有离队 - 他们仍然在俱乐部)。< / p>

然后我尝试了这个条件:

Player.all.sort_by {|p| (p.departures.first.departure_date || Date.today) - p.arrivals.first.arrival_date}

...但我意识到它仍然失败的原因是因为它在nil对象上寻找departure_date(因为p.departures并不存在于所有玩家身上)。

理想情况下,我需要这样的,但我无法让它发挥作用

Player.all.sort_by {|p| (IF p.departures? p.departures.first.departure_date ELSE Date.today) - p.arrivals.first.arrival_date}

我知道这是错的,只是展示了我想要实现的目标:

  1. 如果玩家有任何偏离,请使用p.departures.first.departure_date
  2. 请使用Date.today
  3. 我做错了什么?

1 个答案:

答案 0 :(得分:1)

每个departures都会有一个p.departures.first的集合,但该集合可能为空,因此nil将返回try

在这种情况下,你可以使用rails Player.all.sort_by {|p| (p.departures.first.try(:departure_date) || Date.today) - p.arrivals.first.arrival_date} 方法

Date.current

这是一种方便的方法,但是当经常使用时,通常意味着代码有些臭。

另外:您通常希望使用Date.today代替compile 'com.adobe.creativesdk:image:4.0.0' ,因为当前时区可识别