間違ったコード スニペットを次に示します。
transaction do
Person.having_email(some_email).find_each(:conditions => ["people.identifier != ? OR people.identifier IS NULL", identifier]) do |person|
if person.identifier?
raise "Person is associated with a different identifier"
else
duplicate_entry = Person.find_by_identifier_and_company_id(identifier, person.company_id)
person.update_attribute(:identifier, identifier) if duplicate_entry.nil?
end
end
end
having_email
Person クラス用に定義された named_scope です。
私が直面している問題は、有効なレコードがデータベースに存在する場合でも、重複する可能性のあるエントリを見つける式が常に nil を返すように見えることです。RubyMine デバッガーを使用して同じ式を評価すると、正しいオブジェクトが返されます。
さらに調べてみると、Rails は duplicate_entry 評価ステートメントでクエリを実行していないようです (ログにそのようなクエリはありません)。find_each
呼び出しを通常の呼び出しに置き換えるfind(:all, ...).each
と、問題なく動作するようです (重複したエントリの取得クエリもログに存在します)。
これを引き起こしている可能性のあるものを理解することができませんでした。何か案は?