2015-10-26 36 views
1

我有以下行來計算玩家有多少天一直處於俱樂部:在sort_by中使用屬性條件來捕獲nil值?

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

這工作得很好非現役球員。不過,我想不僅包括前球員,還包括現任球員。我想與Player.all交換Player.where(:current_player => false),但是然後sort_by明顯地捕獲了一堆空位(因爲目前的球員沒有離開 - 他們仍然在俱樂部)。

然後我嘗試這樣的條件:

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

...但我意識到,它仍然失敗的原因是因爲它在尋找一個departure_date nil對象上(因爲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

我在做什麼錯?

回答

1

每個Player將有departures的集合,但該集合可能是空的,所以p.departures.first是否會返回nil

你可以使用軌道try方法在這種情況下

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

這是一個方便的方法,但是當使用了很多往往意味着有一些臭的代碼。

ALSO:你通常要使用Date.current,而不是作爲Date.today目前所知的時區

+0

完美,謝謝! – mantralux