2

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

基本规则:

公司必须至少有一部电话(电话是contact_detail的那种)

问题:

在验证父对象之后,为子对象接受_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

注意:我简化了原始版本,所以目标对你来说很清楚。这是代码的要点。通过使用reject_if 选项,我可以禁止删除所有电话。这可能是目前最好的选择。但我想听听你的意见。

我也发现了这个问题并尝试应用答案,但并没有太大帮助。同样的问题,如上所述。我画了一个流程图,这样你就可以看到轨迹,就像我看到的那样。 流程图

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

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

4

1 回答 1

3

从您引用的问题中,您可以摆脱reject_if并修改以下行phones_number_valid?

phones = contact_details.select { |cd| cd.kind_id == kind.id && !cd.marked_for_destruction? }
于 2012-07-17T04:54:59.537 回答