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