如何验证使用accepts_nested_attributes_for的父模型

时间:2012-07-13 06:57:06

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord polymorphic-associations

我的 Company 模型中有多态关联(contact_details),我想验证父模型。注意:我在父模型中使用accepts_nested_attributes_for。

基本规则:

  该公司必须至少拥有一部手机(手机就是那种手机)   CONTACT_DETAIL)

问题:

  

accepted_nested_attributes_for对子对象的调用销毁   验证父对象

因此用户可以删除手机。当然,稍后,当用户尝试在没有电话的情况下编辑公司时,他/她将收到错误(The company must have at least one phone)。

公司(家长)模式:

class Company < ActiveRecord::Base
  PHONES_NUMBER_MIN = 1

  attr_accessible :name, :contact_details_attributes, ...

  has_many :contact_details, :as => :contactable, :dependent => :destroy

  validate do |company|
    check_phones_number
  end

  accepts_nested_attributes_for :contact_details, :allow_destroy => true, :reject_if => :all_blank

  private

  def phones_number_valid?
    kind = ContactDetail::Kind.phone
    phones = contact_details.select { |cd| cd.kind_id == kind.id }
    phones.size >= PHONES_NUMBER_MIN
  end

  def check_phones_number
    unless phones_number_valid?
      errors.add(:base, :phones_too_short, :count => PHONES_NUMBER_MIN)
    end
  end

  ...
end

ContactDetail(子)模型:

class ContactDetail < ActiveRecord::Base
  attr_accessible :kind_id, :kind_value_source

  belongs_to :contactable, :polymorphic => true
  belongs_to :kind

  validates :kind_value_source, :presence => true, :length => {:maximum => 255}

  ...
end

注意:我简化了原始版本,所以客观清楚。这是gist with the code。 通过使用reject_if选项,我可以禁止删除所有手机。它现在可能是最好的选择。但我想听听你的意见。

我还找到this question并尝试应用答案,但它并没有给出太多帮助。同样的问题,如上所述。我已经绘制了一个流程图,以便您可以看到跟踪,就像我看到的那样。 flowchart

如何在这种情况下验证父模型?

如果有任何帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

根据您引用的问题,您可以摆脱reject_if并修改phones_number_valid?中的行:

phones = contact_details.select { |cd| cd.kind_id == kind.id && !cd.marked_for_destruction? }