在类似的关系中:
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。如何在所有者
答案 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