rails group_by относительные диапазоны дат - PullRequest
2 голосов
/ 12 июля 2011

У меня есть клиент, который хочет просмотреть отчет группы своих сотрудников по дате, когда они заняли свою последнюю должность (date_in_position). Она хочет, чтобы они были сгруппированы по Менее 1 года, 1-3 года, 3-5 лет и старше 5 лет. Я сделал небольшой метод для возврата строки, пригодной для метода group_by, но только менее 1 года работает правильно. Все остальное показывается как более 5 лет.

def dip_range
  case self.date_in_position
    when 1.year.ago...Date.today
      '< 1 year'
    when 3.years.ago...(1.year.ago + 1)
      '1-3 years'
    when 5.years.ago...(3.years.ago + 1)
      '3-5 years'
    else 
      '> 5 years'
  end
end

Ответы [ 4 ]

4 голосов
/ 12 июля 2011

другой способ приблизиться к нему:

def dip_range
  case
    when self.date_in_position.between?(1.year.ago,Date.today)
      '< 1 year'
    when self.date_in_position.between?(3.years.ago,(1.year.ago + 1))
      '1-3 years'
    when self.date_in_position.between?(5.years.ago,(3.years.ago + 1))
      '3-5 years'
    else 
      '> 5 years'
  end
end
2 голосов
/ 12 июля 2011

В диапазоне R1.8 (Time..Date) вообще не работает, к тому же я все равно переписал бы этот кусок кода:

# self is not required by the way
case (Date.today - date_in_position) / 365.2425 
when (0...1)
  '< 1 year'
when (1...3)
  '< 3 years'
when (3...5)
  '< 5 years'
else
  '> 5 year'
end

Или даже:

years = (Date.today - date_in_position) / 365.2425
case  
when years < 1
  '< 1 year'
when years < 3
  '< 3 years'
when years < 5
  '< 5 years'
else
  '> 5 year'
end
0 голосов
/ 12 июля 2011

Я думаю, что это то, что вы хотите, потому что оно будет соответствовать в порядке приоритета, измените синтаксис, если хотите:

def dip_range
  t = self.date_in_position
  if t > 1.year.ago
    '< 1 year'
  elsif t > 3.years.ago
    '1-3 years'
  elsif t > 5.years.ago
    '3-5 years'
  else 
    '> 5 years'
  end
end
0 голосов
/ 12 июля 2011

Integer#years.ago возвращает DateTime, который не сравнивается должным образом с Date объектами, которые вы включаете.Я не совсем уверен, почему это так, но если вы измените

case self.date_in_position

на case self.date_in_position.to_datetime

, этот код будет работать в большинстве случаев.

Кроме того, ваши оценки неверны.Если кто-то начал работать 1 год назад сегодня, он должен показывать себя как 1-3 года, верно?Итак:

def dip_range
  case self.date_in_position
    when (1.year.ago+1.day).to_date..Date.today
      '< 1 year'
    when (3.years.ago+1.day).to_date..1.year.ago.to_date
      '1-3 years'
    when (5.years.ago.to_date+1.day).to_date..3.years.ago.to_date
      '3-5 years'
    else 
      '> 5 years'
  end
end
...