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