gpt4 book ai didi

ruby-on-rails - 机械师,我如何引用我正在制作的对象并将其传递给关联? (关联类型不匹配)

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:03 25 4
gpt4 key购买 nike

我正在尝试为相对复杂的模型建立工厂。

我有一个Pressroom模型,属于Source,Source有很多Pressroom。创建 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 失败了,因为它构建了一个没有打印室的源,所以 after_create 回调创建了一个,当Pressroom.make 试图完成,它的站点不是唯一的。我不想在运行 Pressroom.make

时创建两个打印室

我尝试解决此问题是使新闻发布室蓝图中的来源关联引用新闻发布室。类似于 Source.create :pressrooms => [Pressroom.new] 会做的事情。

Pressroom.blueprint do
source { Source.make :pressrooms => [self] }
site { source.site }
end

不幸的是,self 还不是一个 Pressroom。它是 Machinist::Lathe 的一个实例,所以我得到一个 ActiveRecord::AssociationTypeMismatch 异常。

在工厂和机械师方面,我有点新手。我不想更改业务逻辑,我希望能够使用 Pressroom.make 干净地制作打印室,而无需在此过程中制作两个打印室。如果改用工厂女工会有帮助,我对此持开放态度。

如果有任何关于如何解决此问题的想法,我将不胜感激。

最佳答案

谷歌搜索,我在 http://webcrisps.wordpress.com/2009/08/13/stubbing-before_create-callbacks-in-a-machinist-blueprint/ 上找到了一些提示– 在 Source 蓝图中对 Source 的 after_create :create_initial_pressroom! 回调进行 stub – 在此处使用 Machinist 2 和 Mocha:

Pressroom.blueprint do
source { Source.make!(:without_initial_pressroom) }
site { object.source.site }
end

Source.blueprint do
site
end

Source.blueprint(:without_initial_pressroom) do
object.stubs(:create_initial_pressroom!).returns(true)
end

这样,Pressroom.make! 就可以正常工作,Source.make! 就可以正常工作,而且...我想我很高兴。但是我在上面尝试的解决方案中遇到的问题仍然有点困惑(在机械师 1 和 2 中)。

如果有人知道如何使用 object 进行此操作,请告诉我。它会更简洁,此外,我通常不喜欢在 stackoverflow 上接受我自己的答案。

关于ruby-on-rails - 机械师,我如何引用我正在制作的对象并将其传递给关联? (关联类型不匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5422369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com