Considering following models:
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
Goal is to make sure Child cannot be created without a parent, i.e. Father. Now if father tries to create Child in a nested form, by the time the validation Child is being validated Father has not received an ID yet, thus the validation will fail. One proposed solution is to use ObjectSpace as the following:
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
Is it a good Idea to use ObjectSpace (e.g. Father) in the validation chain? Can there exist another Father in ObjectSpace which by chance is being created at the same time and has a child with the exact same attributes as the Child in question?