当記事は問題解決に向けた記事ではありません。調べても原因が分からなかったので、事象の報告記事となります。
環境
- Ruby
- 2.7.2
- Rails
- 6.0.0
発生事象
ActiveRecord::Base
を継承したクラスにて、特定の条件のレコードの1行目を取得したかったので、次のようにfirst
メソッドを使用していました。
User::Address.where(postCode: "1112222").first
module User class Address < ActiveRecord::Base end end
ただし、なぜか実行するタイミングによっては、どちらかのSQLが発行されていました。そもそも、パラメータを渡していないのでLIMIT 11
は一切期待していないです。サーバ起動の1回目は前者、2回目以降は後者のSQLが発行されることが多かった感覚でした。
SELECT `address`.* FROM `address` WHERE `address`.`postCode` = `1112222` LIMIT 1 SELECT `address`.* FROM `address` WHERE `address`.`postCode` = `1112222` LIMIT 11
最終的な解決
first
だと謎事象が起きるので、配列で返却される余地がないfind_by
を使用しました。
終わりに
記事用にかなり簡素化しているので、再現しない可能性があります。実際は、Mix-inを使用する等の加工をしています。ただ、first
メソッドは上書きしていなかったので、この挙動は使用するGem等の条件がそろえば再発する可能性はあると思われます。
DBを更新するメソッドを作成していたので、更新メソッドが悪さをしているのだと思っていましたが、参照メソッド側に不具合があるとは思いませんでした。ただ、Rails
のfirst
に関するソースコードを追っても特にそのような処理は入っていないので、本当に謎です。
発生条件を追っていないので、役に立たないとは思いますが、自分に対する備忘録としてfirst
メソッドを使用する際は気を付けます。