Ruby on rails 3 如何在FactoryGirl 3.3中为多个关联设置子参数?

Ruby on rails 3 如何在FactoryGirl 3.3中为多个关联设置子参数?,ruby-on-rails-3,rspec2,factory-bot,Ruby On Rails 3,Rspec2,Factory Bot,在我们的rails应用程序中有用户和用户级别。用户具有多个用户级别。我们构建FactoryGirl数据集如下: factory :user_level do position "admin" user end factory :user do login 'testuser' password "password1" #user_levels af

在我们的rails应用程序中有用户和用户级别。用户具有多个用户级别。我们构建FactoryGirl数据集如下:

  factory :user_level do 
    position             "admin"
    user
  end

  factory :user do 
    login                 'testuser'
    password              "password1"

    #user_levels
    after(:build) do |user|
      user.user_levels << FactoryGirl.build(:user_level, :user => user)
    end
  end
  factory :user_level do 
    position             "admin"
    user_id               1
  end

  factory :user do 
    login                 'testuser'
    password              "password1"

    #user_levels
    after(:build) do |user|
      user.user_levels << FactoryGirl.build(:user_level, :user => user)
    end
  end

ul = FactoryGirl.build(:user_level, :position => 'sales')
user = FactoryGirl.create(:user, :user_levels => [ul])

错误为“未定义的方法‘each’”。用
build
替换的
attributes\u会产生相同的错误。为工厂重置用户级位置的正确方法是什么?谢谢。

您的错误与FactoryGirl无关,而与纯rails有关。您正在将单个模型实例添加到:has\u many关系,该关系应由数组提供,因此请尝试:

ul = FactoryGirl.attributes_for(:user_level, :position => 'admin')
user = FactoryGirl.create(:user, :login => 'test', :password => 'password', 
                        :user_levels => [ul])

有几种方法可以在用户级别重置子参数

  • 添加了第二个用户级别(或更多)和重置参数,同时保留在after(:build)回调中定义的默认用户级别
  • 工厂女孩如下:

      factory :user_level do 
        position             "admin"
        user
      end
    
      factory :user do 
        login                 'testuser'
        password              "password1"
    
        #user_levels
        after(:build) do |user|
          user.user_levels << FactoryGirl.build(:user_level, :user => user)
        end
      end
    
      factory :user_level do 
        position             "admin"
        user_id               1
      end
    
      factory :user do 
        login                 'testuser'
        password              "password1"
    
        #user_levels
        after(:build) do |user|
          user.user_levels << FactoryGirl.build(:user_level, :user => user)
        end
      end
    
    ul = FactoryGirl.build(:user_level, :position => 'sales')
    user = FactoryGirl.create(:user, :user_levels => [ul])
    

    上述创建的用户将只有一个职位“sales”。您可以根据需要向用户创建添加更多用户级别

    它解决了未定义方法“each”的错误。对于的属性,存在AssociationIsMatch错误。对于构建,没有代码错误。然而,它说电子邮件是重复的(但是表中没有用户记录,除了正在创建的记录)。如果删除:user\u levels=>[ul],rspec没有错误。就rails控制台而言,:user\u levels=>[ul]似乎在创建的用户中添加了一个额外的用户级别,除了在工厂中定义的默认级别之外。很奇怪,不是吗?