考虑以下模型:
class Father < ActiveRecord::Base
has_many :children, as: :parent, dependent: :destroy
accepts_nested_attributes_for :child
end
class Child < ActiveRecord::Base
belongs_to :parent, polymorphic: true
validates :parent_id, presence: true
end
目标是确保Child
不能在没有父级的情况下创建,即Father
. 现在,如果父亲尝试以Child
嵌套形式创建,Child
则在验证验证时Father
尚未收到 ID,因此验证将失败。一种建议的解决方案是使用ObjectSpace
如下:
class Address < ActiveRecord::Base
belongs_to :parent, polymorphic: true
validates_presence_of :parent
validates_presence_of :parent_id, :unless => Proc.new { |p|
if (new_record? && !parent && parent_type)
parent = nil
ObjectSpace.each_object(parent_type.constantize) do |o|
parent = o if o.children.include?(p) unless parent
end
end
parent
}
end
在验证链中使用ObjectSpace
(例如)是一个好主意吗?Father
是否存在另一个偶然同时被创造Father
出来ObjectSpace
并且有一个与所讨论的属性完全相同的孩子的孩子Child
?