我的公司模型中有一个多态关联 ( 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 选项,我可以禁止删除所有电话。这可能是目前最好的选择。但我想听听你的意见。
我也发现了这个问题并尝试应用答案,但并没有太大帮助。同样的问题,如上所述。我画了一个流程图,这样你就可以看到轨迹,就像我看到的那样。
在这种情况下如何验证父模型?
如果有任何帮助,我将不胜感激。