我有以下一行来计算一名球员在俱乐部的天数:
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}
我知道这是错的,只是展示了我想要实现的目标:
p.departures.first.departure_date
Date.today
我做错了什么?
答案 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'
,因为当前时区可识别