はじめに
Rails 6 に追加されそうな新機能を試す第59段。 今回は、 ActiveRecord where
編です。
Rails 6 は、ActiveRecord の where
がRuby 2.6 で導入された開始のない Range に対応しました。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
User モデルを作る
User モデルを作ります
$ bin/rails g model User name, birth_at:datetime
User モデルを修正する
scope で、2001年以降に生まれた人を検索できるようにします。
このとき (Time.new(2001, 1, 1)..)
と Range の終端が指定されていないことに注意してください。
app/models/user.rb
class User < ApplicationRecord
scope :second_millennium_after, -> { where(birth_at: (Time.new(2001, 1, 1)..)) }
end
seed データを作成する
seed データを作成します。 2001/01/01 より前の誕生日の人と2001/1/1以降の誕生日の人を用意します。
db/seeds.rb
User.create(
[
{ name: 'Taro', birth_at: '2001-01-01' },
{ name: 'Hanako', birth_at: '2002-09-15' }
]
)
マイグレーションして seed データを作成する
$ bin/rails db:create db:migrate db:seed
rails console で確認する
rails console
を実行して確認します。
irb(main):001:0> User.second_millennium_after.to_a
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."birth_at" >= $1 [["birth_at", "2001-01-01 00:00:00"]]
=> [#<User id: 2, name: "Hanako", birth_at: "2002-09-15 00:00:00", created_at: "2019-07-14 05:59:20", updated_at: "2019-07-14 05:59:20">]
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try059_where_endless_range