スリ飯屋Malankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【inspect】Railsコンソールで、ActiveRecord::Relationオブジェクトの表示件数が11件になる理由

Railsコンソールで、ActiveRecord::Relationオブジェクトの表示件数が11件になる理由

これはRailsコンソールで内部的に inspectメソッド が実行されているから。

参考issue https://github.com/rails/rails/issues/30497

別記事の select for update でのロックについても、inspectメソッドの挙動が大いに関係している。

inspectメソッドについて調べた理由

lock!メソッドで特定のレコードをロック。

が、何故かアクションを経由して実行された時はselect for updateが実行されず、ロックされていない。

ロックされていないため、他からもそのレコードを取得出来てしまっていた。

同じコードをRailsコンソールから実行するとselect for updateが実行され、ロック出来ている、ということがあったため。

調べてみると、

  1. Railsコンソールでwhereを実行し、ActiveRecord::Relationオブジェクトを取得

  2. 内部的にinspectメソッドが実行されてSQLがログに出力、select for updateが実行され、ロックされる

  3. アクション内から実行した場合、inspectメソッドをつけずにlock!をしているだけなので、select for updateが実行されず、ロックされない。

というカラクリのようだった。

追記

loadメソッドを使うことでも、ロックをかけることが出来る。

load (ActiveRecord::Relation) - APIdock

というか、ロックをかけたいという目的からするとinspectは不自然なので load を使うべきですね。