rails group_by相对日期范围

时间:2011-07-12 17:50:38

标签: ruby-on-rails ruby group-by date relative

我有一位客户希望在他们上一个职位(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 个答案:

答案 0 :(得分:4)

另一种接近它的方式:

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

答案 1 :(得分:2)

在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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为这是你想要的,因为它会按优先顺序匹配,如果你愿意,可以改变语法:

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