rails のDB検索、日付データの扱い
目次
rails で開発していると便利な機能が豊富にあり、毎度発見するたびに感動すら覚えます。
今回はDB検索と日付データに対しての
便利な関数があるのでお話できればと思います!
all
指定モデルの全データを取得
1 2 |
User.all => SELECT `users`.* FROM `users` |
find
主キーでの検索
1 2 |
User.find(1) => SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 |
注意として存在しないIDを指定するとExceptionになります。
1 2 3 |
User.find(100) => SELECT `users`.* FROM `users` WHERE `users`.`id` = 100 LIMIT 1 *** ActiveRecord::RecordNotFound Exception: Couldn't find User with 'id'=100 |
find_by
指定のカラム値で検索
1 2 |
User.find_by(id: 1) => SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 |
find と違うのは存在しないIDを指定してもnilが返却されExceptionにはなりません。
1 2 3 |
User.find_by(id: 200) => SELECT `users`.* FROM `users` WHERE `users`.`id` = 200 LIMIT 1 nil |
where
おなじみのwhere句になります。
1 2 |
User.where(id: 1) => SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 |
否定句を設定したい場合はwhere.notとし追加します。
1 2 |
User.where(id: 1).where.not(name: 'hoge') => SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 AND (`users`.`name` != 'hoge') |
日付けの日・月・年の範囲での検索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 検索対象の日付 search_date = '2021-06-15' # 対象日(2021-06-15)の0時から23時59分59秒まで検索 User.where(created_at: search_date.in_time_zone.all_day) ⇒ SELECT `users`.* FROM `users` WHERE (`users`.`created_at` BETWEEN '2021-06-15 00:00:00' AND '2021-06-15 23:59:59') # 対象月(2021-06)の月初から月末までの検索 User.where(created_at: search_date.in_time_zone.all_month) ⇒ SELECT `users`.* FROM `users` WHERE (`users`.`created_at` BETWEEN '2021-06-01 00:00:00' AND '2021-06-30 23:59:59') # 対象月(2021)の年始から年末までの検索 User.where(created_at: search_date.in_time_zone.all_year) ⇒ SELECT `users`.* FROM `users` WHERE (`users`.`created_at` BETWEEN '2021-01-01 00:00:00' AND '2021-12-31 23:59:59') |
日付けの操作
ここからはTime型を使用した日付データの便利な機能を
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# 現在の日付 now = Date.current Tue, 15 Jun 2021 # 現在の日付※時刻込み now = Time.current Tue, 15 Jun 2021 00:05:16 JST +09:00 ## 過去系 ## # 前日 now.yesterday # 前月 now.prev_month # 前年 now.prev_year # 指定日前 now.ago(n.days) # 指定月前 now.ago(n.month) # 指定年前 now.ago(n.years) # 月初データ now.beginning_of_month Tue, 01 Jun 2021 00:00:00 JST +09:00 ## 未来系 ## # 翌日 now.tomorrow # 翌月 now.next_month # 翌年 now.next_year # 指定日後 now.since(n.days) # 指定月後 now.since(n.month) # 指定年後 now.since(n.years) # 月末データ now.end_of_month Wed, 30 Jun 2021 23:59:59 JST +09:00 |
ruby like is ハーモニー!