0

間違ったコード スニペットを次に示します。

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_emailPerson クラス用に定義された named_scope です。

私が直面している問題は、有効なレコードがデータベースに存在する場合でも、重複する可能性のあるエントリを見つける式が常に nil を返すように見えることです。RubyMine デバッガーを使用して同じ式を評価すると、正しいオブジェクトが返されます。

さらに調べてみると、Rails は duplicate_entry 評価ステートメントでクエリを実行していないようです (ログにそのようなクエリはありません)。find_each呼び出しを通常の呼び出しに置き換えるfind(:all, ...).eachと、問題なく動作するようです (重複したエントリの取得クエリもログに存在します)。

これを引き起こしている可能性のあるものを理解することができませんでした。何か案は?

4

1 に答える 1

0

問題は、with_scope ブロックを設定することで find_each と find_in_batches が機能することです。したがって、同じモデルで他の検索を行う必要がある場合は、スコープが適用されます。

この問題の根本原因は、このブログ投稿で有効な回避策とともに非常によく説明されています。

于 2012-10-31T13:57:54.863 に答える