1

私は今年、Rails Rumble に参加しましたが、タイム ゾーンの問題に悩まされていました。

アプリを linode にアップロードし、EST タイム ゾーンまたは -4 から UTC に住んでいます。

私はモデルを持っており、次のことを行うことで物事を保存します:

def self.processing_creation(user_id, home_id, chore_id)
  registered_chore = RegisteredChore.where("DATE(created_at) = ?", Date.today).find_by_user_id_and_home_id_and_chore_id(user_id, home_id, chore_id)
  unless registered_chore
    registered_chore = RegisteredChore.create(user_id: user_id, home_id: home_id, chore_id: chore_id, created_at: Time.zone.now)
    user = registered_chore.user
    user.add_one_chore_point
  end
  registered_chore
end

RegisteredChore.where("DATE(created_at) = ?", Date.today).find_by_user_id_and_home_id_and_chore_id(user_id, home_id, chore_id)

データが作成されたばかりであっても false を返します。

「作成」は UTC で保存されますが、Date.today はユーザーのローカル タイム ゾーンを使用することに気付きました。

これを処理する最良の方法は何ですか?

問題を説明する別の例:

  1. EST 時間の午後 11 時に雑用を登録したいです。
  2. サーバーはすでに翌日 (例: 12) です。
  3. Rails は翌日の日付 (12) にデータを保存します。
  4. しかし、ユーザーはまだ 11 日目です。
  5. 技術的には、現在の方法を使用しているユーザーは、日がデータベースおよびユーザー インターフェイスと異なるため、エントリを再度保存できます。

これを解決するには?

4

2 に答える 2

1

Rails 3はデフォルトで、GMT + 00:00タイムゾーンの相対的なデータベースにすべての時間を保存します。したがって、タイムゾーンに応じて時間を計算するときにオフセットを設定する必要があります。それ以外の場合は、以下を追加してデフォルトのActiverecordタイムゾーンを変更できますapplication.rb

config.time_zone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')
config.active_record.default_timezone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')
于 2012-10-17T01:13:40.127 に答える
1

デフォルトでは、Rails は時刻を UTC としてデータベースに保存します。を使用している場合DATE([Date.today])、12 日ではなく 11 日にレコードが検索されます。正しい日付を取得するには、おそらくTime.zoneユーザーの現在のタイムゾーンに設定してから、クエリを実行する必要があります。

この種の日付検索を処理するために、 by_starという gem を作成しました。これを使用する必要があると思います。それを使用すると、クエリは次のようになります。

RegisteredChore.today.where(:user_id => user.id, 
                            :home_id => home.id,
                            :chore_id => chore.id)
于 2012-10-17T00:35:12.470 に答える