如何在FactoryGirl中手动添加引用模型的列?

时间:2016-09-22 14:56:10

标签: ruby-on-rails factory-bot

我有当前的建模:

A House belongs_to User
A User has_one House

这意味着House模型引用了User。我的工厂用户,看起来像这样:

FactoryGirl.define do
  factory :user do
    house
  end
end 

这样做基本上是创建一个引用该用户的用户和房屋。

现在,我在名为column的{​​{1}}中引入了User,我希望能够允许工厂按原样工作,但也填写{{1}与创建的众议院。我这样做的原因是因为我想逐步改变参考方向。

我这样做了:

house_id

但我怀疑可能有更好的方法来做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,您对has_onebelongs_to关系的工作方式有错误的认识。

belongs_to设置1-1或1对多关系,并将外键列放在模型表中。如果houses.user_id引用users.id

class User < ActiveRecord::Base
  has_one :house 
end

class House  < ActiveRecord::Base
  belongs_to :user
end

其次,规格不应取决于按顺序创建的记录。它会产生脆弱的规格和订购问题。相反,让工厂女孩为你创造物品。

FactoryGirl.define do
  factory :user do
    house
  end
end 

FactoryGirl.define do
  factory :house do
    user
  end
end 

并且不要假设记录具有给定的ID:

# bad
get :show, id: 1

# good
get :show, id: user.to_param

如果您需要设置一个明确关联的记录,您只需传递用户或住宅选项:

let(:user) { create(:user) }
let(:house) { create(:house, user: user) }

it 'should be associated with the correct user' do
  expect(house.user).to eq user
end