gpt4 book ai didi

ruby-on-rails - Rails 3 忽略 Postgres 唯一约束异常

转载 作者:行者123 更新时间:2023-11-29 11:17:04 26 4
gpt4 key购买 nike

挽救异常并继续处理的正确方法是什么?我有一个包含文件夹和项目的应用程序,通过名为 folders_items 的连接表具有 habtm 关系。该表有一个唯一的约束,确保没有重复的项目/文件夹组合。如果用户多次尝试将项目添加到同一个文件夹,我显然不希望添加额外的行;但我也不想停止处理。

当唯一约束被违反时,Postgres 会自动抛出异常,所以我尝试在 Controller 中忽略它,如下所示:

rescue PG::Error, :with => :do_nothing

def do_nothing

end

这在单次插入时效果很好。 Controller 执行状态代码为 200 的渲染。但是,我有另一种方法可以在循环中执行批量插入。在那个方法中, Controller 在遇到第一个重复行时退出循环,这不是我想要的。起初,我认为循环一定被包裹在一个正在回滚的事务中,但事实并非如此——复制之前的所有行都被插入了。我希望它简单地忽略约束异常并移动到下一个项目。如何防止 PG::Error 异常中断此操作?

最佳答案

一般来说,你的异常处理应该在最接近错误的地方,你可以对异常做一些明智的事情。在你的情况下,你希望你的 rescue 在你的循环中,例如:

stuff.each do |h|
begin
Model.create(h)
rescue ActiveRecord::RecordNotUnique => e
next if(e.message =~ /unique.*constraint.*INDEX_NAME_GOES_HERE/)
raise
end
end

几个兴趣点:

  1. 数据库内部的约束冲突会给您一个ActiveRecord::RecordNotUnique 错误,而不是底层的PG::Error。据我所知,如果您直接与数据库对话而不是通过 ActiveRecord,您会得到一个 PG::Error
  2. INDEX_NAME_GOES_HERE 替换为唯一索引的真实名称。
  3. 您只想忽略您期望的特定约束违规,因此 next if(...) 位后跟无参数的 raise(即重新- 如果它不是您期望看到的,则引发异常)。

关于ruby-on-rails - Rails 3 忽略 Postgres 唯一约束异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15756533/

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