Rails:使用范围验证唯一性,没有自引用关联

时间:2017-07-26 21:00:56

标签: ruby-on-rails

在类似的关系中:

class Cat
  belongs_to :owner
  has_one :pet, class_name: "Cat", foreign_key: "pet_id"
  validates :name, uniqueness: { scope: :owner_id }
end

class Owner
  has_many :cats
end

我希望属于Cat的每个Owner都有一个唯一的名称。例如,鲍勃和约翰(两个所有者)都可以拥有一只名叫比尔的猫,但约翰不能拥有两只名叫比尔的猫。此外,我希望名为比尔的猫能够拥有一只名叫比尔的猫。这很棘手,因为Bill都是Cat模型的一个实例,并且都有owner_id。如何在所有者

下立即在Cat级别上使名称唯一

2 个答案:

答案 0 :(得分:0)

多态关联应该起作用

class AddOwnableToCats < ActiveRecord::Migration
  def change
    add_column :cats, :ownable_id, :integer
    add_column :cats, :ownable_type, :string
    add_index :cats, [:ownable_type, :ownable_id]
  end
end

class Cat < ActiveRecord::Base
  belongs_to :ownable, polymorphic: true
  has_one :pet, class_name: 'Cat', as: :ownable
  validates :name, uniqueness: { scope: [:ownable_id, :ownable_type] }
end

class Owner < ActiveRecord::Base
  has_many :cats, as: ownable
end

答案 1 :(得分:0)

我最终使用了自定义验证:

# Cat.rb

  # this line of code was here
  has_one :cat, class_name: "Cat", foreign_key: "parent_id"

  validates_each :name do |record, attr, value|
    similar = Cat.where.not(id: record.id, parent_id: record.id).where(attr => value, owner_id: record.owner_id)
    record.errors.add(attr, 'already exists') unless similar.empty?
  end
相关问题