代码之家  ›  专栏  ›  技术社区  ›  jedi

对has_和_属于_多个关联的唯一性验证

  •  0
  • jedi  · 技术社区  · 6 年前

    我有一个模型 AnimalType 哪一个 has_and_belongs_to_many :trainers, join_table: 'trainers_animal_types' 我需要一个验证规则,这样我就可以创建一个只有现有动物类型的培训师,以避免有一个培训师有重复的动物类型。例如,驯兽师可以有动物类型 ['Cat', 'Dog'] 不是 ['Cat', 'Cat', 'Dog', 'Dog']

    class AnimalType < ApplicationRecord
      has_and_belongs_to_many :trainers, join_table: 'trainers_animal_types'
    end
    

    动物型 数据库中只有一个名称。

    create_table "animal_types", force: :cascade do |t|
      t.string   "name"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
    end
    

    连接表

    create_table "trainers_animal_types", id: false, force: :cascade do |t|
      t.integer "trainer_id"
      t.integer "animal_type_id"
    end
    

    是否有方法验证名称的唯一性 has_and_belongs_to_many 协会?

    1 回复  |  直到 6 年前
        1
  •  1
  •   buncis    6 年前

    所以你想要的是 name 字段在 animal_types 表对吗?如果是的话

    您可以在表中添加唯一索引,如下所示

    rails generate migration add_index_to_animal_types

    # migration file
    add_index :animal_types, :name, :unique => true
    

    然后在 animal.rb

    validates :name, uniqueness: true

    如果要验证所属表中的唯一性,并且必须对许多表进行唯一性验证,则可以添加唯一索引,如

    rails generate migration add_index_to_trainer_animal_types

    # migration file
    add_index :trainer_animal_types, [:trainer_id, :animal_type_id], :unique => true
    add_index :trainer_animal_types, :trainer_id
    add_index :trainer_animal_types, :animal_type_id