我正在尝试为相对复杂的模型建立工厂。
我有一个 Pressroom 模型,属于 Source,Source 有很多 Pressrooms。创建 Source 时,如果 pressrooms 为空,则会在 after_create 过滤器中创建初始 pressroom。每个来源的新闻发布室站点必须是唯一的。
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
失败了,因为它构建了一个没有新闻发布室的 Source,所以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
而无需在此过程中制作两个新闻发布室。如果切换到工厂女孩会有所帮助,我对此持开放态度。
对于如何解决此问题的任何想法,我将不胜感激。