0

我正在编写一个接受命令行参数的 rails 脚本。一个参数是相对日期 - 即 3.months.ago

此选项作为字符串传递给我的脚本。如何使用该字符串作为相对日期?我的直觉是施放它,但不确定是什么...

例如:

>> Event.count(:all, :conditions => ["created_at > ?", 3.months.ago])
=> 18883
>>
>> user_date = "3.months.ago"
>> Event.count(:all, :conditions => ["created_at > ?", user_date])
ActiveRecord::StatementInvalid: PGError: ERROR:  invalid input syntax for type timestamp: "3.months.ago"
4

2 回答 2

1

你最好使用像Chronic这样可以处理结构的 gem,至少在英语中,比如“明天”或“三周后”。主要的警告是它似乎假定“本地时间”,这在 Web 应用程序中几乎没有意义,因此您可能需要进行额外的黑客攻击(至少时区计算)以使事情以与您的用户匹配的方式工作期望。

于 2012-07-15T03:51:26.983 回答
0

只需评估它以获得一个 Time 实例:

[1] pry(main)> eval('3.months.ago').class
=> ActiveSupport::TimeWithZone
[2] pry(main)> eval('3.months.ago')
=> Sun, 15 Apr 2012 00:20:25 EDT -04:00
[3] pry(main)> Event.where("created_at > ?", eval('3.months.ago')).to_sql
=> "SELECT `events`.* FROM `events`  WHERE (created_at > '2012-04-15 00:22:46')"

当然,您不希望eval用户直接输入任何内容。但这是处理您构建的相对日期的合理方法。

于 2012-07-15T04:20:02.603 回答