Rails:如何验证只有一对多关系的多边记录被标记为主要记录

时间:2011-08-07 02:59:55

标签: ruby-on-rails validation

我在我的Rails应用中设置了一对多关系:Person有很多Addresses。我在名为Addresses的{​​{1}}表中添加了一个字段。如何通过验证强制执行只有一个地址is_primary设置为true?

基本上我想说:对于is_primary Addresses addressable_typePerson addressable_id的所有X行,只有一行可以{ {1}}设置为is_primary。如果不是这种情况,请拒绝保存并抛出表单验证错误。

2 个答案:

答案 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)

PersonAddress之间添加新的一对一关联会不会更好?这样,您就可以确保只有一个主地址,而无需进行任何验证和错误处理。

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