ある年の年始から年末まで、月初から月末までで範囲検索したくなることがあると思うけど、
ActiveSupportのメソッドを利用すれば下記のように漏れなくスマートに書くことができる。
コード例
# 仮の日付
search_date = '2016-1-25'
# 年での指定
Item.where(created_at: search_date.in_time_zone.all_year)
# 月での指定
Item.where(created_at: search_date.in_time_zone.all_month)
# 日での指定
Item.where(created_at: search_date.in_time_zone.all_day)
発行されるSQLクエリ
-- 年での指定
SELECT "items".*
FROM "items"
WHERE ("items"."created_at" BETWEEN '2016-01-01 00:00:00' AND '2016-12-31 23:59:59')
-- 月での指定
SELECT "items".*
FROM "items"
WHERE ("items"."created_at" BETWEEN '2016-01-01 00:00:00' AND '2016-01-31 23:59:59')
-- 日での指定
SELECT "items".*
FROM "items"
WHERE ("items"."created_at" BETWEEN '2016-01-25 00:00:00' AND '2016-01-25 23:59:59')
例では日付の文字列をTimeクラスに変換しているけどもちろんTime.current.all_year
などと書いて使うこともできる。