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_email是为 Person 类定义的 named_scope。

我面临的问题是,即使数据库中存在有效记录,找到可能重复条目的表达式似乎总是返回 nil。当我使用 RubyMine 调试器评估相同的表达式时,它会返回正确的对象。

进一步反省,似乎 rails 没有对 duplicate_entry 评估语句触发任何查询(日志中没有这样的查询)。在用find_each正常find(:all, ...).each呼叫替换呼叫时,事情似乎工作正常(重复条目检索查询也存在于日志中)。

我一直无法弄清楚可能导致这种情况的原因。有任何想法吗?

4

1 回答 1

0

问题是 find_each 和 find_in_batches 通过设置 with_scope 块来工作。因此,如果您需要在同一模型上进行任何其他查找,则适用范围。

此问题的根本原因已在此博客文章中得到很好的解释以及有效的解决方法

于 2012-10-31T13:57:54.863 回答