2

考虑以下模型:

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

4

0 回答 0