gpt4 book ai didi

ruby-on-rails - rails : ActiveRecord:RecordNotUnique with first_or_create

转载 作者:行者123 更新时间:2023-12-04 14:29:41 27 4
gpt4 key购买 nike

我的模型表中有这个索引:

UNIQUE KEY `index_panel_user_offer_visits_on_offer_id_and_panel_user_id` (`offer_id`,`panel_user_id`)

还有这段代码:

def get_offer_visit(offer_id, panel_user_id)
PanelUserOfferVisit.where(:offer_id => offer_id, :panel_user_id => panel_user_id).first_or_create!
end

在我们的应用程序中随机导致 ActiveRecord::RecordNotUnique 异常,问题是:

Duplicate entry for key 'index_panel_user_offer_visits_on_offer_id_and_panel_user_id'

我在 Rails 文档上读到 first_or_create! 不是原子方法,在高并发环境中可能会导致此类问题,解决方案就是捕获异常和重试。

我尝试了不同的方法,包括 Retriable gem重试一定次数以重复操作,但 RecordNotUnique 仍会引发。

我什至试图改变逻辑:

def get_offer_visit(offer_id, panel_user_id)
begin
offer_visit = PanelUserOfferVisit.where(:offer_id => offer_id, :panel_user_id => panel_user_id).first_or_initialize
offer_visit.save!
offer_visit

rescue ActiveRecord::RecordNotUnique
offer_visit = PanelUserOfferVisit.where(:offer_id => offer_id, :panel_user_id => panel_user_id).first
raise Exception.new("offer_visit not found") if offer_visit.nil?

offer_visit
end
end

但是代码仍然会引发我创建的自定义异常,我真的不明白它为什么会在第一次尝试时创建记录失败,因为记录存在,但是当它试图找到它没有找到的记录时再次。

我错过了什么?

最佳答案

您似乎正在为 PanelUserOfferVisit.where(...).first 查询访问 rails 查询缓存:rails 刚刚执行了相同的 SQL 查询,它认为结果将在持续时间内保持不变的请求。

ActiveRecord::Base.connection.clear_query_cache 在第二次调用 db 之前应该有帮助

此外,如果不是 new_record?

,您也不必 保存!记录

关于ruby-on-rails - rails : ActiveRecord:RecordNotUnique with first_or_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37183537/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com