きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Railsでfirstを指定しているのにたまに11件取得していた(原因不明)

当記事は問題解決に向けた記事ではありません。調べても原因が分からなかったので、事象の報告記事となります。

環境

  • 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を更新するメソッドを作成していたので、更新メソッドが悪さをしているのだと思っていましたが、参照メソッド側に不具合があるとは思いませんでした。ただ、Railsfirstに関するソースコードを追っても特にそのような処理は入っていないので、本当に謎です。

発生条件を追っていないので、役に立たないとは思いますが、自分に対する備忘録としてfirstメソッドを使用する際は気を付けます。

参考情報