Является ли хорошей идеей использовать ObjectSpace для поиска родительского ActiveRecord в цепочке проверки?
Учитывая следующие модели:
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
еще не получил идентификатор, поэтому проверка не удастся. Одним из предложенных решений является использование 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
обсуждаемый?