RailsのActiveRecordで今日・昨日など特定の日に保存されたレコードを取得

スポンサーリンク

Rails の ActiveRecord で、今日や昨日、一週間前など特定の1日のうちに保存されたレコードをすべて一括で取得する方法です。

— 環境 —
Rails 4.1.1
Ruby 2.1.2

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

特定の日に保存されたレコードを取得する scope の例

ユーザーが投稿したポスト(Post モデル)を例に、今日や昨日、1ヶ月前など特定の日に投稿されたポストを取得する scope を以下のように書きます。

app/models/post.rb

上記の scope を使う

Time#all_day は Range オブジェクトを返し、Time#all_day を使った場合は、SQL としては BETWEEN を使った SQL が発行される。Rails コンソールで確認。

pry で確認したところ、BETWEEN の SQL が発行されるのを確認できた。

上記 scope 例を使う場合の注意点

また、上記 scope 例は注意点が一つありまして、Rails の Time.zone で取得されるタイムゾーンでの丸1日分のレコードを取得してきます。Time.zone は config/application.rb の config.time_zone の設定が反映され、デフォルトでは UTC となる。

なので Time.zone が UTC となっている場合は、上記の例では UTC での丸一日分のレコードを取得してきます。ユーザーごとのタイムゾーンでの丸一日分など、例えば日本時間での丸一日分のレコードを取得するには、以下のようにタイムゾーンを考慮したコードが必要になるかと思います。

ユーザーごとの複数タイムゾーンへの対応は、以下記事が大変参考になる。

Working with time zones in Ruby on Rails – Elabs

このページの “Working with multiple user time zones” に書いてある方法が良さそう。コントローラーの around_action で、Time.use_zone を使ってユーザーのタイムゾーンを設定する方法。

Rails で世界中の複数のタイムゾーンに対応する場合、タイムゾーンの扱いは相当ややこしい。これについては、もう少し掘り下げて別途記事を書く予定です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!