我的 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并尝试应用答案,但它并没有给出太多帮助。同样的问题,如上所述。我已经绘制了一个流程图,以便您可以看到跟踪,就像我看到的那样。
如何在这种情况下验证父模型?
如果有任何帮助,我将不胜感激。
答案 0 :(得分:3)
根据您引用的问题,您可以摆脱reject_if
并修改phones_number_valid?
中的行:
phones = contact_details.select { |cd| cd.kind_id == kind.id && !cd.marked_for_destruction? }