Ruby on rails Rails 5:使用查找或创建。每个

Ruby on rails Rails 5:使用查找或创建。每个,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,我正在请求打印表单。如果请求成功,我会将响应作为order保存到数据库中。我的问题在于这一部分: current_user.find_或create_by(landing_id:item[“landing_id])do | order| 如果用户提交新的类型表单,该方法将找不到登录id,因此将再次创建所有订单。但这些订单已经存在于数据库中,因此每个订单都会多次保存到我的数据库中 我怎样才能避免这种情况 items = response.parsed_response["items"] ite

我正在请求打印表单。如果请求成功,我会将响应作为
order
保存到数据库中。我的问题在于这一部分:

current_user.find_或create_by(landing_id:item[“landing_id])do | order|

如果用户提交新的类型表单,该方法将找不到
登录id
,因此将再次创建所有
订单
。但这些
订单
已经存在于数据库中,因此每个
订单
都会多次保存到我的数据库中

我怎样才能避免这种情况

items = response.parsed_response["items"]
 items.each do |item|
  @order = current_user.orders.find_or_create_by(landing_id: item["landing_id"]) do |order|
   order.landing_id = item["landing_id"]
   order.email = item["hidden"]["email"]
   order.price = item["hidden"]["price"]
   order.project = item["hidden"]["project"]
   order.save!
  end
 end

以下各项的活动记录文档:

请注意,此方法不是原子的,它首先运行一个SELECT,如果没有结果,则尝试插入。如果有其他线程或进程,则两个调用之间存在竞争条件,并且可能会出现两个类似记录的情况

无论如何,您可以通过向
user\u id
landing\u id
列的组合添加uniq约束来解决此问题:

add_index :orders, [:user_id, :landing_id], unique: true
并相应地更改您的代码:

items = response.parsed_response["items"]
items.each do |item|
  begin
    Order.transaction(requires_new: true) do
      @order = current_user.orders.find_or_create_by(landing_id: item["landing_id"]) do |order|
        order.landing_id = item["landing_id"]
        order.email = item["hidden"]["email"]
        order.price = item["hidden"]["price"]
        order.project = item["hidden"]["project"]
        order.save!
      end
    end
  rescue ActiveRecord::RecordNotUnique
    next
  end
end

找不到登录id,因此将再次创建所有订单。但是数据库中已经存在这些订单
您说它找不到
登录id
,您说订单存在,但您是通过
登录id
查找的,如果订单存在,那么您应该通过确实存在的字段进行查找。可能我说了question错误。我会尝试让它更清楚。我的数据库中有两个订单,一个是landing_id XXX,另一个是YYY。现在用户决定提交一个新表单。因此我向Typeform发出GET请求,但这个Typeform响应有landing_id ZZZ。到目前为止,我的数据库中没有landing_id ZZZ的订单。因此它将我将创建一个新记录。现在的问题是,它还创建了一个重复的登录id XXX和YYY记录。对不起,语法我是手机上的一员。我建议你添加
byebug
gem并调试你的代码。我不明白为什么它会创建多个订单,但我现在也不知道
项上有什么。调试请求的一步一步,我想你会发现是什么造成了额外的订单。