has_and_belongs_to_many关联的唯一性验证

时间:2019-01-24 09:09:22

标签: ruby-on-rails activerecord associations

我有一个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

AnimalType在数据库中只有一个名称。

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 个答案:

答案 0 :(得分:1)

所以您想对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