ruby-on-rails - RoR/Postgres - 两列唯一索引错误。 "duplicate key value violates unique constraint",即使没有任何记录

标签 ruby-on-rails

所以合约可以有很多服务。连接表是 ContractsService(contracts_services),非常简单。

索引设置为:

def change
  add_index :contracts_services, [:contract_id, :service_id], unique: true
end

如果我尝试像这样添加(或通过 API,或以任何方式,所以不特定于这段代码):

ContractsService.where(contract_id: 16, service_id: 17).first_or_create!

我收到此错误:

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_contracts_services_on_contract_id_and_service_id"
DETAIL:  Key (contract_id, service_id)=(16, 17) already exists.

但是:

irb(main):015:0> ContractsService.where(contract_id: 16, service_id: 17).count
D, [2017-10-26T07:25:01.782432 #4] DEBUG -- :    (1.7ms)  SELECT COUNT(*) FROM "contracts_services" WHERE "contracts_services"."deleted_at" IS NULL AND "contracts_services"."contract_id" = $1 AND "contracts_services"."service_id" = $2  [["contract_id", 16], ["service_id", 17]]
=> 0

我被困在这里了,以前从未见过这个。我错过了一些简单的事情吗?或者索引已损坏?还有别的吗?

最佳答案

似乎您在 ContractsService 模型中有 default_scope 。 查看 SQL:"contracts_services"."deleted_at"IS NULL

并且您的唯一索引不包含 deleted_at 列。

如果您尝试ContractsService.rewhere(contract_id: 16, service_id: 17).count那么您应该找到这条记录

关于ruby-on-rails - RoR/Postgres - 两列唯一索引错误。 "duplicate key value violates unique constraint",即使没有任何记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46948175/

相关文章:

ruby-on-rails - 如何在 Rails 测试中指定 POST 参数?

ruby-on-rails - Rails - Active Record "RuntimeError: can' t 修改卡住字符串“与表单生成器有某种关系?

ruby-on-rails - 回形针不调整图像大小或创建样式目录

ruby-on-rails - 如何检索序列化数据?

ruby-on-rails - 今天如何在 Rails 中从基于 created_at 的数据库中选择数据

javascript - 为什么 ZeroClipboard 只复制句子的第一个单词?

ruby-on-rails - 在路由的多个位置嵌套相同的资源

ruby-on-rails - Rails Postgresql - 同义词字典有点不更新

ruby-on-rails - rails 6 : How can I run validations on an ActiveStorage item outside of the model?

ruby-on-rails - 如何将 Rails 时区名称映射到 PostgreSQL?