尝试在另一个对象之前创建对象时FactoryGirl中的错误

时间:2013-10-14 16:39:49

标签: ruby-on-rails ruby-on-rails-3.2 factory-bot

我正在尝试创建一个名为global_list的模型。它将采用与用户相关联的列表和与项目相关联的global_id。我需要创建一个用户(在该对象的回调中创建一个列表)和一个项目(其中global_identification被创建为项目创建的回调)。以下解决方案都不能用于尝试创建这些关联对象。他们应该吗?有没有更好的方法来处理这个?我尝试过为prefer_item_list_id创建访问器,但这也没有用。

FactoryGirl.define do
  factory :global_list do
    before(:create) {
       user=FactoryGirl.create(:user)
       mi=FactoryGirl.create(:item)
    }
    list_id user.liked_list_id
    global_id mi.global_id
  end
end

块会有帮助吗?

FactoryGirl.define do
  factory :global_list do
    before(:create) {
      user=FactoryGirl.create(:user)
      mi=FactoryGirl.create(:item)
    }

    list_id { List.first.id }
    global_id { 3 } # 3 will be created at this point { mil.global_id } doesn't work
  end
end

我开始认为FactoryGirl无法做到这一点。任何帮助,将不胜感激?

3 个答案:

答案 0 :(得分:1)

试试这个。

   FactoryGirl.define do
      factory :global_list do
        before(:create) { |list|
           user=FactoryGirl.create(:user)
           mi=FactoryGirl.create(:item)
           list.list_id = user.liked_list_id
           list.global_id = mi.global_id
        }
      end
    end

完全未经测试

答案 1 :(得分:1)

这在FactoryGirl中是完全可能的,并且实际上经常使用。

在下面的工厂中定义关联对象很简单。不需要花哨的“之前”。

FactoryGirl.define do
  factory :global_list do
    user
    mi
    foo_attribute
    bar_attribute
  end

  factory :user do
    # blah
  end

  factory :mi do
    # blah
  end
end

使用上面的代码,FactoryGirl将首先创建所需的关联对象,并使用它们的id自动创建此对象。

答案 2 :(得分:0)

这样做了:

FactoryGirl.define do
  factory :global_list do
    list_id { FactoryGirl.create(:user).liked_list_id }
    global_id { FactoryGirl.create(:item).global_id }
  end
end

Ruby在这种情况下的障碍令人困惑。所以我问:what's the practical difference between these two FactoryGirl declarations