向使用 FactoryBot 构建的对象添加互惠关联
Add recriprocal association to objects built using FactoryBot
我正在尝试清理一些测试并让它们更快地 运行,并且我有一堆 FactoryBot 生成的项目,这些项目当前已创建并保存到数据库中。显然这对性能不利,所以我试图将其中的大部分更改为使用 build
而不是 create
以避免数据库瓶颈。我当前的问题与使对象具有工作关联有关。我目前拥有的:
class User < ApplicationRecord
has_many :transaction_items,
class_name: 'Transaction',
foreign_key: 'user_id'
end
class Transaction < ApplicationRecord
belongs_to :user, class_name: 'User'
end
并且测试使用这些 类 像这样:
@user = create(:user)
@transaction1 = create(:transaction, user: @user)
@transaction2 = create(:transaction, user: @user,)
我同意创建 User
对象并将其保存到数据库中,因为我需要它可用于身份验证目的。我需要更改要使用 build
实例化的 Transaction
对象。如果我进行更改,Transaction
对象会知道它们关联的 User
对象(@transaction1.user
return 是 User
实例)但反之则不然,即 @user.transaction_items
不 return 关联的 Transaction
对象。它确实 return 一个 Transaction::ActiveRecord_Associations_CollectionProxy
对象,但它是一个空集合。这会导致失败,因为被测试的代码使用了 #transaction_items
方法并且它需要在其中包含关联的对象。
我远不是 FactoryBot 方面的专家,虽然有大量关于 FactoryBot 协会的重要信息,但出于某种原因,我无法让协会正常工作。我需要在这里做什么才能让这种更复杂的协会在我的工厂中运作?
使用 Rails 5.1,FactoryBot v5.0.2
很简单
@user = create(:user)
def build_transaction(user)
user.transaction_items.build(attributes_for(:transaction, user: user))
end
@transaction1 = build_transaction(@user)
@transaction2 = build_transaction(@user)
我正在尝试清理一些测试并让它们更快地 运行,并且我有一堆 FactoryBot 生成的项目,这些项目当前已创建并保存到数据库中。显然这对性能不利,所以我试图将其中的大部分更改为使用 build
而不是 create
以避免数据库瓶颈。我当前的问题与使对象具有工作关联有关。我目前拥有的:
class User < ApplicationRecord
has_many :transaction_items,
class_name: 'Transaction',
foreign_key: 'user_id'
end
class Transaction < ApplicationRecord
belongs_to :user, class_name: 'User'
end
并且测试使用这些 类 像这样:
@user = create(:user)
@transaction1 = create(:transaction, user: @user)
@transaction2 = create(:transaction, user: @user,)
我同意创建 User
对象并将其保存到数据库中,因为我需要它可用于身份验证目的。我需要更改要使用 build
实例化的 Transaction
对象。如果我进行更改,Transaction
对象会知道它们关联的 User
对象(@transaction1.user
return 是 User
实例)但反之则不然,即 @user.transaction_items
不 return 关联的 Transaction
对象。它确实 return 一个 Transaction::ActiveRecord_Associations_CollectionProxy
对象,但它是一个空集合。这会导致失败,因为被测试的代码使用了 #transaction_items
方法并且它需要在其中包含关联的对象。
我远不是 FactoryBot 方面的专家,虽然有大量关于 FactoryBot 协会的重要信息,但出于某种原因,我无法让协会正常工作。我需要在这里做什么才能让这种更复杂的协会在我的工厂中运作?
使用 Rails 5.1,FactoryBot v5.0.2
很简单
@user = create(:user)
def build_transaction(user)
user.transaction_items.build(attributes_for(:transaction, user: user))
end
@transaction1 = build_transaction(@user)
@transaction2 = build_transaction(@user)