Rails 1.day.ago,参数为字符串?

时间:2011-12-19 22:13:03

标签: ruby-on-rails ruby

我有一个方法在一段时间内调用ago,但是时间应该能够作为一个参数提供,我已经大大简化了方法到重要的小部分,想象一下争论就像“日”或“月”

normalize_time(time)
  1.time.ago
end

如何获取time参数,并将其作为1上的方法执行以获取Time对象?

6 个答案:

答案 0 :(得分:2)

鉴于选择的数量是有限的和小的,您是否考虑使用案例陈述?

case time
when :day
  1.day.ago
when :month
  1.month.ago
when :year
  1.year.ago
end

答案 1 :(得分:1)

根据您要传递的内容time,您可以执行类似

的操作
1.send(time).ago

其中time类似:day等。

答案 2 :(得分:1)

1.send(time).ago

如果时间来自不受信任的来源,这将允许他们在1上调用他们想要的任何方法,所以要小心

答案 3 :(得分:1)

作为答案的替代方案(肯定有效),请考虑像chronic这样的库:

> require 'chronic'
> Chronic.parse('one day ago')
=> 2011-12-18 17:17:17 -0500
> Chronic.parse('one week ago')
=> 2011-12-12 17:17:21 -0500
> Chronic.parse('one month ago')
=> 2011-11-19 17:17:26 -0500

它可能比您实际想要的更多,并且您的解决方案几乎肯定更快。

答案 4 :(得分:1)

你可以“信任”,只需做一个“案例”......

case time
  when "day", "month"
    1.send(time).ago
end

答案 5 :(得分:0)

我想我在发布问题后就知道了,方法send()似乎很好地实现了这个目标:

time = "day"
1.send(time).ago

这是一个很好的方法吗?