Я пытаюсь построить фабрики для относительно сложных моделей.
У меня есть модель пресс-центра, которая принадлежит источнику, а у источника много пресс-залов. При создании источника, если пресс-залы пустые, в фильтре after_create создается начальный пресс-центр.
Сайт пресс-центра должен быть уникальным для каждого источника.
class Source
has_many :pressrooms
after_create :create_initial_pressroom! # if pressrooms.empty?
...
end
class Pressroom
belongs_to :source
# source.pressrooms.map(&:site) should have unique elements
validate_on_create :check_unique_site
end
Это приводит к моей проблеме: мой Pressroom.make
терпит неудачу, поскольку он создает источник, у которого нет пресс-залов, поэтому обратный вызов after_create
создает его, и когда Pressroom.make
пытается завершить работу, его сайт уникальный. Я не хочу создавать две пресс-комнаты, когда я запускаю Pressroom.make
Моя попытка решить эту проблему - сделать так, чтобы ассоциация источников в проекте пресс-центра ссылалась на пресс-службу. Вроде того, что Source.create :pressrooms => [Pressroom.new]
сделает.
Pressroom.blueprint do
source { Source.make :pressrooms => [self] }
site { source.site }
end
К сожалению, self
еще не является пресс-центром. Это экземпляр Machinist :: Lathe, поэтому я получаю исключение ActiveRecord :: AssociationTypeMismatch.
Я немного новичок, когда дело доходит до фабрик и машинистов. Я не хочу менять бизнес-логику, и я хочу иметь возможность аккуратно создавать пресс-залы с Pressroom.make
, не создавая при этом двух пресс-залов. Если переход на заводскую девушку поможет, я открыт для этого.
Буду признателен за любые идеи, как решить эту проблему.