4

我定义了这个工厂:

factory :post, :parent => :post_without_countries, class: Post do |p|
       p.country_ids {|country_ids| [country_ids.association(:country), country_ids.association(:country)]} 
end

我希望它输出两个独特的国家。相反,它只是两次插入与关联相同的国家/地区:

#<Post id: nil, title: "Atque id dolorum consequatur.", body: "Praesentium saepe ullam magnam. Voluptatum tempora ...", created_at: nil, updated_at: nil, user_id: 1>
[#<Country id: 1, name: "Dominican Republic", isocode: "lyb", created_at: "2012-10-20 13:52:18", updated_at: "2012-10-20 13:52:18">, #<Country id: 1, name: "Dominican Republic", isocode: "lyb", created_at: "2012-10-20 13:52:18", updated_at: "2012-10-20 13:52:18">]

有任何想法吗?

4

4 回答 4

8

更好地使用build_listorcreate_list方法:

post.countries = create_list(:country, 2)
于 2015-08-27T09:25:09.647 回答
2

而不是这样做:

2.times { post.countries << FactoryGirl.create(:country) }

在 RSpec 中,您可以after_create像这样制作一个钩子:

after_create do |post|
  2.times { post.countries << FactoryGirl.create(:country) }
end

如果需要自定义创建国家的次数,可以做一个transient属性:

#in the post factory definition
ignore do
  num_countries 0 #default to zero
end

#different after_create
after_create do |post, proxy|
  proxy.num_countries.times { post.countries << FactoryGirl.create(:country) }
end
于 2012-10-23T20:37:18.913 回答
0

看起来工厂女孩可能没有正确迭代。我脑海中浮现的两个问题是。

你是FactoryGirl.build在你打算使用的时候使用FactoryGirl.create吗?

您是否尝试过替换p.country_idsp.sequence(:country_ids)

我希望这些能给你指明正确的方向。如果没有,也许更多信息?

于 2012-10-20T20:11:31.687 回答
0

好的,我通过将我创建的许多国家关系从工厂中取出并在 RSpec 中创建它来解决这个问题:

  post = FactoryGirl.build(:post)
  2.times { post.countries << FactoryGirl.create(:country) }
于 2012-10-23T13:17:29.390 回答