我有一辆Foo型车,上面有很多"吧台".我为每一件物品都有一个工厂.wine 吧工厂与Foo有关联;它将在创建条时实例化一个Foo.

我想要一个工厂,创建一个包含wine 吧的Foo.理想情况下,该条将通过:条工厂创建,并遵守用于创建Foo的构建策略(create/build).

我知道我可以打电话给:wine 吧工厂,然后从新wine 吧拿到Foo参考.我想避免这种情况;在我的测试用例中,重要的对象是Foo;给wine 吧工厂打电话似乎有点迂回.此外,我可以看到需要一个有多个wine 吧的Foo.

这在工厂里可能吗?你如何在父母中定义这种关系?

推荐答案

Factory.after_ hooks似乎是成功做到这一点的唯一途径.我找到了一种在不重复代码的情况下维护构建策略的方法:

Factory.define :foo do |f|
  f.name "A Foo"
  f.after(:build) { |foo|
    foo.bars << Factory.build(:bar, :foo => foo)
  }
  f.after(:create) { |foo|
    foo.bars.each { |bar| bar.save! }
  }
end

documentation表示如果使用:create构建策略,after_build将在after_create之前被调用.如果使用:build,那么只调用after_build,每个人都很高兴.

我还创建了一个抽象的通用版本at this gist,以保持干燥.

Ruby-on-rails相关问答推荐

RubyOnRail在测试环境中启动失败

错误AESGCMOpen获取密码:消息身份验证失败:Golang解密GCM

如何从数组中提取值

线程如何在 Web 应用程序中工作?

Ruby on rails 查询不知道怎么写

Rails Active Record - 从关系中获取 ids 数组

如果 URL 不存在,请将 http(s) 添加到 URL?

有没有办法在模型而不是视图中使用复数()?

在 Nokogiri 中获取属性值以提取链接 URL

rails 4.0, rake db:sessions:create

如何将变量传递给render_to_string?

我应该将全局共享部分模板放在哪个文件夹中?

如何检测我的代码是否在 Rails 3 的控制台中运行?

使用 rvm 更新 ruby​​ 版本后收到警告消息Path set to RVM

在 Rails 中命名布尔列

我是否必须手动卸载所有依赖的 gem?

Ruby on Rails:如何从显示的子资源中获取错误消息?

从 Rails 控制器获取主机名

资源和资源方法之间的区别

如何为 Rails 控制器添加延迟以进行测试?