0

在此处输入图像描述

我在 rails simple activerecord 查询中看到了上述问题

where(email:email).first_or_create!
find_or_create_by!(phone_number: phone_number)

这两个查询都不是任何其他查询的一部分,这意味着不包含在任何连接/包含查询中。但是对于一个独立的查询,为什么会出现这个问题?

仅仅因为一个操作被多次调用,不同的输入不能被称为 N+1 查询问题。

def email_address(email)
  email = email.downcase
  begin
    where(email:email).first_or_create!
  rescue ActiveRecord::RecordNotUnique
    find_by_email(email)
  end
end

Assume that the method was called [arry_of_emails].map {|x| email_address(x)}
4

1 回答 1

1

警告是正确的!如果您的数组中有 27 个项目,它将调用 DB 27 次!

我们如何解决它?我有下一个建议:

    addresses = Address.where(email: params[:emails]) #load all addresses in one request
    list = addresses.inject({}) { |memo, adr|  memo[adr.email] = adr; memo }
    params[:emails].each do |email|
      # if an address is not in our list create new
      Address.create(email: email) unless list.keys?(email)
    end
于 2019-08-22T11:28:20.643 回答