0
0

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す 126(upsert_all bug fix編)

Posted at

はじめに

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

スクリプトを作成する

スクリプトを作成します。スクリプトは以下の処理を実行します。

  1. Andy というname を持つ User を1つ登録する。
  2. キャッシュを有効にする。
  3. 登録したUserを User.first で検索して、name を出力する。
  4. User.upsert_all を実行して、 Andy から Bob に name を更新する。
  5. 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"

試したソース

参考情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0