这是错误的代码段。
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
调用时,事情似乎工作正常(重复条目检索查询也存在于日志中)。
我无法理解可能导致此问题的原因。有什么想法吗?
答案 0 :(得分:0)
问题是find_each和find_in_batches通过设置a来工作 with_scope块。因此,如果你需要做任何其他发现 同一型号,适用范围。
此问题的根本原因以及有效的解决方法in this blog post
已得到很好的解释