我在我的Rails应用中设置了一对多关系:Person
有很多Addresses
。我在名为Addresses
的{{1}}表中添加了一个字段。如何通过验证强制执行只有一个地址is_primary
设置为true?
基本上我想说:对于is_primary
Addresses
addressable_type
和Person
addressable_id
的所有X
行,只有一行可以{ {1}}设置为is_primary
。如果不是这种情况,请拒绝保存并抛出表单验证错误。
答案 0 :(得分:2)
我喜欢这样的东西,看起来更优雅:
class Person
has_many :addresses
has_one :primary_address, -> { where(primary: true) }, class_name: 'Address'
end
class Address
belongs_to :person
validates :primary, uniqueness: { scope: :person_id }, if: :primary
end
我认为验证在其他方面也同样有效?
validates :person_id, uniqueness: { scope: :primary }, if: :primary
答案 1 :(得分:0)
在Person
和Address
之间添加新的一对一关联会不会更好?这样,您就可以确保只有一个主地址,而无需进行任何验证和错误处理。
class Person
belongs_to :primary_address, class_name: 'Address'
has_many :addresses
end
class Address
belongs_to :person
def is_primary?
self.person.primary_address == self
end
end