FactoryBot 一条记录关联多个属性
FactoryBot one record associated with many attributes
我有 User
、Assignment
和 Department
模型。
我的 Assignment
模型与 User
模型有 2 个 belongs_to
关联,如 requestor
和 assignee
.
User
和 Assignment
模型也依次 belongs_to
一个部门。
我想 运行 对我的 Assignment
进行验证,以便 assignment
、requestor
和 assignee
都属于同一个部门。
这是我的模型代码
# app/models/assignment.rb
class Assignment < ApplicationRecord
belongs_to :requestor, class_name: "User", foreign_key: "requested_by"
belongs_to :assignee, class_name: "User", foreign_key: "assigned_to"
belongs_to :department
end
# app/models/user.rb
class User < ApplicationRecord
has_many :user_departments, class_name: "UserDepartment"
has_many :departments, through: :user_departments
belongs_to :department
end
# app/models/department.rb
class Department < ApplicationRecord
has_many :user_departments, class_name: "UserDepartment"
has_many :users, through: :user_departments
has_many :assignments
has_many :users
end
这是我的测试代码
# spec/factories/assignment.rb
FactoryBot.define do
sequence(:title) { |n| "Title #{n}" }
sequence(:description) { |n| "Description #{n}" }
factory :assignment do
title
description
image { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/Floyd.jpeg'), 'image/jpeg') }
release_date { DateTime.now >> 1 }
department { create(:department) }
requestor create(:user, :bm, department: "I want to use the same department as created in earlier line here")
assignee create(:user, :mu, department: "I want to use the same department as created in earlier line here")
end
end
我应该在哪里定义部门,以便我可以在所有三个协会中使用同一个部门。
你试过self.department
了吗?它在我的代码中有效:
# spec/factories/assignment.rb
FactoryBot.define do
sequence(:title) { |n| "Title #{n}" }
sequence(:description) { |n| "Description #{n}" }
factory :assignment do
title
description
image { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/Floyd.jpeg'), 'image/jpeg') }
release_date { DateTime.now >> 1 }
department { create(:department) }
requestor { create(:user, :bm, department: self.department) }
assignee { create(:user, :mu, department: self.department) }
end
end
希望我答对了问题。您希望所有模型都使用相同的部门。
这是您在规范中实际做的事情。
describe Foo::Bar do
before(:each) do
@department = create(:deparment)
@assignment = create(:assignment, department: @department)
@user = create(:user, department: department)
# ....
end
但这始终取决于您的整体结构。当 assignment
是中心模型并且始终有一个部门时,您可以执行类似
的操作
describe Foo::Bar do
before(:each) do
@assignment = create(:assignment)
@user = create(:user, department: @assignment.department)
# ....
end
我有 User
、Assignment
和 Department
模型。
我的 Assignment
模型与 User
模型有 2 个 belongs_to
关联,如 requestor
和 assignee
.
User
和 Assignment
模型也依次 belongs_to
一个部门。
我想 运行 对我的 Assignment
进行验证,以便 assignment
、requestor
和 assignee
都属于同一个部门。
这是我的模型代码
# app/models/assignment.rb
class Assignment < ApplicationRecord
belongs_to :requestor, class_name: "User", foreign_key: "requested_by"
belongs_to :assignee, class_name: "User", foreign_key: "assigned_to"
belongs_to :department
end
# app/models/user.rb
class User < ApplicationRecord
has_many :user_departments, class_name: "UserDepartment"
has_many :departments, through: :user_departments
belongs_to :department
end
# app/models/department.rb
class Department < ApplicationRecord
has_many :user_departments, class_name: "UserDepartment"
has_many :users, through: :user_departments
has_many :assignments
has_many :users
end
这是我的测试代码
# spec/factories/assignment.rb
FactoryBot.define do
sequence(:title) { |n| "Title #{n}" }
sequence(:description) { |n| "Description #{n}" }
factory :assignment do
title
description
image { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/Floyd.jpeg'), 'image/jpeg') }
release_date { DateTime.now >> 1 }
department { create(:department) }
requestor create(:user, :bm, department: "I want to use the same department as created in earlier line here")
assignee create(:user, :mu, department: "I want to use the same department as created in earlier line here")
end
end
我应该在哪里定义部门,以便我可以在所有三个协会中使用同一个部门。
你试过self.department
了吗?它在我的代码中有效:
# spec/factories/assignment.rb
FactoryBot.define do
sequence(:title) { |n| "Title #{n}" }
sequence(:description) { |n| "Description #{n}" }
factory :assignment do
title
description
image { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/Floyd.jpeg'), 'image/jpeg') }
release_date { DateTime.now >> 1 }
department { create(:department) }
requestor { create(:user, :bm, department: self.department) }
assignee { create(:user, :mu, department: self.department) }
end
end
希望我答对了问题。您希望所有模型都使用相同的部门。 这是您在规范中实际做的事情。
describe Foo::Bar do
before(:each) do
@department = create(:deparment)
@assignment = create(:assignment, department: @department)
@user = create(:user, department: department)
# ....
end
但这始终取决于您的整体结构。当 assignment
是中心模型并且始终有一个部门时,您可以执行类似
describe Foo::Bar do
before(:each) do
@assignment = create(:assignment)
@user = create(:user, department: @assignment.department)
# ....
end