代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

Factory Girl:自动指定父对象

  •  9
  • Ben Scheirman  · 技术社区  · 14 年前

    我刚进入工厂女孩,我遇到了一个困难,我相信应该容易得多。我只是不能把文档变成一个有效的例子。

    假设我有以下模型:

    class League < ActiveRecord::Base
       has_many :teams
    end
    
    class Team < ActiveRecord::Base
       belongs_to :league
       has_many :players
    end
    
    class Player < ActiveRecord::Base
       belongs_to :team
    end
    

    我想做的是:

    team = Factory.build(:team_with_players)
    

    让它为我培养一批球员。我试过这个:

    Factory.define :team_with_players, :class => :team do |t|
       t.sequence {|n| "team-#{n}" }
       t.players {|p| 
           25.times {Factory.build(:player, :team => t)}
       }
    end
    

    但这在 :team=>t 部分,因为 t 不是真的 Team 这是一个 Factory::Proxy::Builder . 我 把一个队指派给一个队员。

    在某些情况下,我想建立一个 League 让它做一件类似的事情,创建多个队和多个球员。

    我错过了什么?

    2 回复  |  直到 14 年前
        1
  •  5
  •   oldhomemovie    14 年前
    Factory.define :team do |team|
      team.sequence(:caption) {|n| "Team #{n}" }
    end
    
    Factory.define :player do |player|
      player.sequence(:name) {|n| "John Doe #{n}" }
      player.team = nil
    end
    
    Factory.define :team_with_players, :parent => :team do |team|
      team.after_create { |t| 25.times { Factory.build(:player, :team => t) } }
    end
    
        2
  •  2
  •   Priit    14 年前

    这个怎么样:

    Factory.define :team_with_players, :class => :team do |t|
      t.sequence { |n| "team-#{n}" }
      t.players do |team| 
        25.times.collect { |n| team.association(:player) }
      end
    end