スリ飯屋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 を使うべきですね。




RailsやRubyを学びたい人へ


RailsやRubyを学びたい人は、

RailsHack(レイルズハック)という、

最近できた新しいプログラミングスクール(今なら通常価格69,800円が、早期割で29,800円!)か、

Udemy で下記のコースを受講すると良いです★


✅1. フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座

✅2. 【はむ式】ハンズオンで学ぶRuby on Rails 6【Dockerにも触れられる】 <- おすすめ。ハムさんはReactやTypeScriptの教材も非常に丁寧。

✅3. はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう




また、

Udemy は定期的にセールをやっていますし(90%OFFとかもザラ)、

「30日間なら返金できる」ので、

満足できなかった時でも安心です。


f:id:mah666hhh:20201129193352p:plain


【公式】RailsHack(レイルズハック)

【公式】Udemyで学んでみる