2010-12-01 4 views
1

これは簡単なことですが、私はRailのタイムゾーン実装が私の仕事を捨てていると思います...ActiveRecordスコープは、今日作成されたレコードを検索しますか?

Rails 3(とruby 1.9.2)でスコープを作成して今日作成されたレコードは?

scope :today, lambda { 
    where("created_at >= ? and created_at <= ?", 
      Date.today.beginning_of_day, Date.today.end_of_day) 
    } 

をそして、それはそれが必要として動作して表示されません。

現在、私はこれをやっています。今日の午前12時から午後11時59分までの24時間をユーザーの現地時間帯で表現したいと思っています。日付をUTCなどに変換する必要がありますか?

答えて

3

を動作するはずです。つまり、ユーザーのタイムゾーンの開始日と終了日。そのために、まずユーザーのタイムゾーンで現在の時刻を解析します。ゾーンをユーザーのタイムゾーンに設定し、計算を実行するか、次のコードのバリエーションを使用して時間を直接解析できます。あなたはそのスコープでのみ行いたい場合は

(UTCは、あなたのアプリケーションのタイムゾーンであれば、あなたはアプリUTCに変換し、クエリを解雇でしょう)

timezone = current_user.timezone # Mountain Time (US & Canada) 
users_current_time = ActiveSupport::TimeZone[timezone].parse(Time.now.to_s) 

users_current_time.beginning_of_dayusers_current_time.end_of_dayは、右の時間範囲を生成する必要がありますすべてのアクションのTime.zone = current_user.timezonebefore_filterを設定して、範囲内で使用することをお勧めします。 This railscastはそれをどうやって行うのかについて公正なアイデアを提供します。

1

もしあなたがmysqlを使っているのであれば、あなたはその日に合ってみたいと思っています。別の言い方をすれば、12月1日以降のすべてのレコードが必要です。 12月1日の午前12時から午後11時59分までは、日付を検索するだけであれば意味します。

scope :today, lambda { 
    where("created_at = ?", 
      Time.now.strftime("%Y-%d-%m") 
    } 

そのようなことは、あなたは、ユーザーのタイムゾーンを考慮する必要があります

+0

ちょっと疑問に思うのですが、それはDateTimeフォーマット全体で真を返しますか?もしそうなら、私はこの問題を冗長な解決策で何年も解決してきました。 –

+0

次のようなSQLクエリを返します: "... WHERE created_at = '2010-12-01' ... MySQLは12月1日に何かにマッチして構文解析します – brycemcd

+0

strtime形式が間違っています.YEAR-MONTH- DAY、「%Y-%m-%d」のように、 – mguymon

0

これはいかがですか?

scope :today, lambda { 
    where("created_at >= ? and created_at <= ?", 
      Date.today.beginning_of_day.utc, Date.today.end_of_day.utc) 
    } 
関連する問題