2017-10-26 8 views
1

契約には多くのサービスを含めることができます。結合テーブルはContractsService(contracts_services)です。かなり簡単です。RoR/Postgres - 2列のユニークインデックスのエラー。レコードがなくても "重複キー値が一意制約に違反しています"

で設定インデックス:私は(コードのこの作品にとても具体的でない、またはAPIを介して、あるいはどのような方法で)このように追加しようと

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

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 

私はここで立ち往生していますが、これはこれまで見たことがありません。私は何かシンプルなものを逃している?またはインデックスが壊れていますか?他に何か?

+0

フムを、見つける必要がありContractsService.rewhere(contract_id: 16, service_id: 17).countをしようとした場合。 –

+0

@FabrizioBertoglioそれはその質問の重複ではない、私の問題はnullインデックスではありません。 –

答えて

3

default_scopeContractsServiceというモデルのようです。 SQLを見てください:"contracts_services"."deleted_at" IS NULL

あなたのユニークなインデックスにはdeleted_atの列が含まれていません。

あなたは、あなたが面白いこのレコード

+0

"リオーダとは異なり、名前付き条件のスコープを解除するのはwhereステートメント全体ではありません。 - 'rewhere'は' deleted_at'に触れません。 –

+0

ありがとう!これだよ。 'acts_as_paranoid' deleted_atは別のインデックスです。私はそれらを組み合わせる必要があります、何かインデックスを言うには、これらの2つの列IFの削除された場合は、NULLは、ユニークな制約を無視しますか? –

+0

私は 'ContractsService.only_deleted.where(contract_id:16、service_id:17).count#=> 1'を使用しましたが、' rewhere'はそれを表示しませんでした。 –

関連する問題