データベースに一意性制約を追加して、重複するエントリがジョインテーブルに追加されないようにしようとしています。しかし、それは動作していないようです。私は結合テーブルのモデルを持っていないので、モデルレベルのバリデーションを追加していません。データベースの一意性制約がアソシエーションを使用して重複レコードの作成を停止しない
class CreateBreedsAndTags < ActiveRecord::Migration[5.1]
def change
create_table :breeds do |t|
t.string :name, unique: true, present: true
t.timestamps
end
create_table :tags do |t|
t.string :name, unique: true, present: true
t.timestamps
end
create_join_table :breeds, :tags do |t|
t.integer :breed_id
t.integer :tag_id
t.index [:breed_id, :tag_id], unique: true
end
end
end
品種とタグモデルは両方とも非常に単純であり、私は関連を試してみたかったので、彼らはhas_and_belongs_to_many
を使用します。ここでは
-> { distinct }
を追加することができますが、最初に重複が作成されるのを止めたいと思います。
class Breed < ApplicationRecord
# Some validations and stuff here
has_and_belongs_to_many :tags
end
私はレールコンソールで繁殖してタグを作成した場合。結合テーブル上のデータベースレベルのユニークな制約があるにもかかわらず、私はこのような何かを行うことができます。
b = Breed.create(name: 'b')
t = Tag.create(name: 't')
b << t
b << t
b.save!
b.tags # outputs the same tag multiple times
EDIT:
1)それは私が<<
をoverritingをお勧めします。このstack overflowを見つけたことは注目に値します協会。しかし、これは私のユニークな制約が失敗している理由を説明していません。
2)dbレベルの制約を推奨するstack overflowが見つかりましたが、それは私には効果がありません。
EDIT2:
ここでは、データベースから、いくつかのテーブル情報である:
そして、私はそれぞれの移行が最大の単一のテーブルを作成または変更する必要があり\d breeds_tags
Table "public.breeds_tags"
Column | Type | Modifiers
----------+--------+-----------
breed_id | bigint | not null
tag_id | bigint | not null
Indexes:
"index_breeds_tags_on_breed_id" btree (breed_id)
"index_breeds_tags_on_tag_id" btree (tag_id)
データベースの結合テーブルを 'psql'で見たことがありますか? –
@muistooshort私はいくつかのデータベース情報で私の答えを更新しました。 2つのインデックスが作成されたようですが、ユニークな制約はありませんか? als oa 'breed_tags'テーブルがあります!私は基本的にこの[スタックオーバーフロー](https://stackoverflow.com/questions/2204058/list-columns-with-indexes-in-postgresql)からクエリを実行しました – Dbz
@Dbz:あなたはそうです。 Railsは2つのインデックスを作成しました。ユニークな制約はありませんでした。 [Railsの一意性ヘルパー](http://guides.rubyonrails.org/active_record_validations.html#uniqueness)は、オブジェクトが保存される直前に属性の値が一意であることを検証し、データベースに一意性制約を作成しません。 。 " –