Factory_girl 关联验证

发布于 2024-08-17 07:08:36 字数 623 浏览 2 评论 0原文

我有一个问题,我有一个父模型 Foo,它同时具有 has_many :barshas_many :bazes。最后,我还有一个连接模型 BarBaz,其中 belongs_to :barbelongs_to :baz。我想验证所有 bar_bazes,以便它的 bar 和 baz 都属于同一个 foo。但我似乎无法找到一种方法来为这个模型定义一个有效的工厂。

Factory.define(:bar) do |bar|
  bar.association(:foo)
end

Factory.define(:baz) do |baz|
  bar.association(:foo)
end

Factory.define(:bar_baz) do |bar_baz|
  baz_bar.association(:foo)
  baz_bar.association(:bar)
  baz_bar.association(:baz)
end

当我尝试创建后者时,我收到无效记录错误,因为 bar 和 baz factory_girl 尝试将其关联起来,每个都有自己的 foo。我完蛋了吗?

I have an issue where I have a parent model Foo, which both has_many :bars and has_many :bazes. Finally, I also have a join model BarBaz which belongs_to :bar and belongs_to :baz. I want to validate all bar_bazes so that its bar and baz both belong to the same foo. But I can't seem to figure out a way to define a factory for this model that would be valid.

Factory.define(:bar) do |bar|
  bar.association(:foo)
end

Factory.define(:baz) do |baz|
  bar.association(:foo)
end

Factory.define(:bar_baz) do |bar_baz|
  baz_bar.association(:foo)
  baz_bar.association(:bar)
  baz_bar.association(:baz)
end

I get an invalid record error when I try to create the latter, because the bar and baz factory_girl tries to associate it each have their own foo. Am I screwed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花心好男孩 2024-08-24 07:08:37

创建具有深层嵌套关联的工厂的疯狂导致我创建了 fixie ,它允许您使用 ActiveRecord 创建测试记录。它在 db:test:prepare 步骤期间运行。我用它来消除对固定装置的需要。您可以继续使用工厂来更容易构建对象。

The insaneness of creating factories with deeply nested associations led me to create fixie which lets you create test records using ActiveRecord. It runs during the db:test:prepare step. I use it to eliminate the need for fixtures. You can continue to use factories for easier-to-build objects.

所有深爱都是秘密 2024-08-24 07:08:36

因此,经过几个小时的努力解决这个问题后,我想我终于找到了解决方案。但这很疯狂,所以希望其他人仍然可以告诉我我在哪里愚蠢。

Factory.define :foo do |foo|
end

Factory.define :bar do |bar|
end

Factory.define :baz do |baz|
end

Factory.define :foo_with_baz do |foo|
  foo.after_create { |foo| Factory(:baz, :foo => foo) }
end

Factory.define :bar_baz do |bar_baz|
  bar_baz.bar {|bar| bar.association(:bar, :foo => Factory(:foo_with_baz))
  bar_baz.after_build {| bar_baz| bar_baz.baz_id = bar_baz.foo.bars.first.id }
end

关键问题是数据库中需要有一个 foo ,您可以单独通过工厂获取,因为您可以在factories.rb中使用局部变量或任意ruby代码(据我所知)。

So after hours of beating my head against this issue, I think I finally have a solution. It's pretty insane though, so hopefully someone else can still show me where I'm being stupid.

Factory.define :foo do |foo|
end

Factory.define :bar do |bar|
end

Factory.define :baz do |baz|
end

Factory.define :foo_with_baz do |foo|
  foo.after_create { |foo| Factory(:baz, :foo => foo) }
end

Factory.define :bar_baz do |bar_baz|
  bar_baz.bar {|bar| bar.association(:bar, :foo => Factory(:foo_with_baz))
  bar_baz.after_build {| bar_baz| bar_baz.baz_id = bar_baz.foo.bars.first.id }
end

The key issue being that there needs to be a foo in the database already you can get at through the factories alone, since you can use local variables or arbitrary ruby code in factories.rb (as far as I can tell).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文