【问题标题】:factory_girl_rails has_many association includes only one from a collection of manyfactory_girl_rails has_many 关联仅包含许多集合中的一个
【发布时间】:2011-09-21 13:59:40
【问题描述】:

我正在使用factory_girl_rails 而不是固定装置。这是我的模型:

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

这是我的工厂:

Factory.define :user do |u|
end

Factory.define :task do |t|
  t.association :user, :factory => :user
end

在测试中我这样做:

user = Factory.create :user
(1..5).each { Factory.create(:task, :user => user)}

我遇到的问题是之后user.tasks 只包含一项任务。

我尝试过像这样定义user 工厂:

Factory.define :user do |u|
  u.tasks {|tasks|  [tasks.association(:user)] }
end

像这样:

Factory.define :user do |u|
  u.tasks {|tasks|  [tasks.association(:user), tasks.association(:user)] }
end

在这两种情况下,Factory.create(:user) 都会导致无限循环。

【问题讨论】:

  • (1..5).each { Factory.create(:task, :user =&gt; user)} 在我的控制台中运行良好。

标签: ruby-on-rails ruby-on-rails-3 associations factory-bot


【解决方案1】:

我认为您正在做的是倒退 - 您可以从用户创建任务,但反之亦然,就像您尝试做的那样。从概念上讲,关联是从用户到任务。

我所做的就是为这种类型的用户创建一个特殊的工厂。

Factory.define :user_with_tasks, :parent => :user do |user|
  user.after_create {|u| 5.times { Factory.create(:task, :user => user) } }
end 

另外,如果你只想使用默认工厂,你就这样做

Factory.define :task do |f|
  f.user :user
end 

无需指定工厂

更新:看起来其他人过去做过类似的事情: Populating an association with children in factory_girl

【讨论】:

    【解决方案2】:

    啊,这行得通:

    Factory.define :task do |t|
      t.association :user
      t.after_create {|t| t.user.tasks << t}
    end
    

    John,您的方法可行,但我实际上无法使用您描述的内容,因为在我的测试中,任务还需要引用另一个(未提及的)模型,而我在 user_with_tasks 中看不到引用它的方法工厂定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多