はじめに
Rails 6 に追加された新機能を試す第126段。 今回は、upsert_all bug fix
編です。
Rails 6.0.0 では、 query のキャッシュが有効になっている状態で、 upsert_all
を実行した後、キャッシュがクリアされないというバグがありました。
Rails 6.0.1 以降では修正されています。
Ruby 2.6.5, Rails 6.0.2.2, Rails 6.0.1, Rails 6.0.0 で確認しました。
$ rails --version
Rails 6.0.2.2
今回は、 スクリプトを作成して確認していきます。
Rails プロジェクトを作る
Rails プロジェクトを新たに作成します。
$ rails new rails_sandbox
$ cd rails_sandbox
User モデルを作成する
User モデルを作成します。
$ bin/rails g model User name
スクリプトを作成する
スクリプトを作成します。スクリプトは以下の処理を実行します。
- Andy という
name
を持つ User を1つ登録する。 - キャッシュを有効にする。
- 登録したUserを
User.first
で検索して、name
を出力する。 -
User.upsert_all
を実行して、 Andy から Bob にname
を更新する。 -
User.first
を使ってname
を出力する。
scripts/cache_clear.rb
User.delete_all
ActiveRecord::Base.connection.enable_query_cache!
User.create(name: 'Andy')
user = User.first
p user.name
User.upsert_all(
[
{
id: user.id,
name: 'Bob',
created_at: user.created_at,
updated_at: Time.now
}
]
)
user = User.first
p user.name
Rails 6.0.0 では
Rails 6.0.0 では、 キャッシュがクリアされないため、名前が変わりません。、
$ bin/rails -v
Rails 6.0.0
$ bin/rails runner scripts/cache_clear.rb
Running via Spring preloader in process 369
"Andy"
"Andy"
Rails 6.0.1 以降では
キャッシュがクリアされるため、名前が期待通りに変化します。
$ bin/rails -v
Rails 6.0.1
$ bin/rails runner scripts/cache_clear.rb
Running via Spring preloader in process 447
"Andy"
"Bob"
試したソース