Является ли хорошей идеей использовать 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 обсуждаемый?

0 ответов

Другие вопросы по тегам