2017-07-26 60 views
0

在类似这样的关系:导轨:验证与范围的独特性,没有自我指涉协会

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

多态ASSOCATION应该工作

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 
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