2017-07-26 72 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