0

コマンドラインパラメータを受け入れるRailsスクリプトを書いています。1つのパラメータは相対的な日付です-つまり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

少なくとも「明日」や「今から3週間後」のように、英語で構成を処理できる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 に答える