2017-07-26 61 views
1

在一個關係類似於此驗證屬性的唯一性:Rails的:如何僅在一個一對多的關係

class Cat 
    belongs_to :owner 
end 

class Owner 
    has_many :cats 
end 

我想這屬於一個Owner每個Cat有一個唯一的名稱。例如,鮑勃和約翰(兩個所有者)都可以擁有一隻名叫比爾的貓,但約翰不能擁有兩隻名叫比爾的貓。

我試過validates :name, uniqueness: { scope: owner_id }對我的貓模型,以及scope: owner,但我遇到了這個錯誤:NameError: undefined local variable or method owner_id for #<Class:0x000000073578f0>。第二個我註釋掉我的validates聲明,調用cat_instance.owner_id返回正確的ID。

+0

我猜你缺少':''之前在owner_id'您的驗證聲明。 – Abdullah

回答

3

按照文檔http://guides.rubyonrails.org/active_record_validations.html#uniqueness

你應該通過一個符號的作用域選項:

validates :name, uniqueness: { scope: :owner_id } 
+0

謝謝。假設一個Cat has_one:pet,class_name:「Cat」,foreign_key:「pet_id」,我將如何讓名稱在所有者**下的Cat級別上唯一唯一**即,從前面的例子中,Bob可以只有一隻名叫比爾的貓,但比爾可以有一隻名叫比爾的貓? – mycellius

+0

我不確定我是否完全理解了您的需求,但是您可以將多個屬性傳遞給範圍屬性,如:'uniqueness:{scope:[:owner_id,:pet_id]}',我認爲這可能有效 –

1
class Owner 
    has_many :cats 
    validates :name, uniqueness: { scope: :owner_id } 
end