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

我希望属于Owner的每个Cat都有一个唯一的名称。例如,鲍勃和约翰(两个主人(都可以拥有一只名叫比尔的猫,但约翰不能拥有两只名叫比尔的猫。另外,我希望那只名叫比尔的猫能够拥有一只名叫比尔的猫。这很棘手,因为比尔的两个模型都是 Cat 模型的实例,并且都有owner_id。如何使该名称在">仅所有者">下的 Cat 级别上是唯一的?

多态性组合应该有效

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

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

# 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

最新更新