2016-09-22 1 views
0

나는 현재의 모델링이있다. 사용자에 대한 내 공장은 다음과 같습니다 :이 기본적으로 사용자 및 사용자 것을 참조하는 하우스를 만드는 무엇FactoryGirl에서 모델을 참조하는 열을 수동으로 추가하는 방법은 무엇입니까?</p> <pre><code>A House belongs_to User A User has_one House </code></pre> <p><code>House</code> 모델 <code>User</code>에 대한 참조를한다는 것을 의미한다 :

FactoryGirl.define do 
    factory :user do 
    house 
    end 
end 

합니다.

지금, 나는 house_id라는 User에서 column을 도입하고 그대로 나는 공장 작업 할 수 있도록 할 수 있어야 할뿐만 아니라, 생성 된 하우스와 house_id를 입력합니다. 내가이 작업을 수행하는 이유는 참조 방향을 점진적으로 변경하려고하기 때문입니다.

은 내가 이런 식으로 일을했다 :

FactoryGirl.define do 
    factory :user do 
    house 
    house_id { House.find_by(user_id: id).id } 
    end 
end 

그러나 나는이 작업을 수행 할 수있는 더 좋은 방법이있을 수 있습니다 생각한다. 이견있는 사람?

+0

RSpec에서 FactoryGirl을 사용합니까? 그렇다면 factory 파일 밖에서 spec 파일을 작성하거나 작성할 때 house_id를 지정할 수 있습니다. – YTorii

+0

하지만 인스턴스를 만들 때마다 명시 적으로 나타나지 않도록 공장의 일부로 갖고 싶습니다. –

답변

0

먼저 has_onebelongs_to 관계가 어떻게 작동하는지 잘못 알고 있습니다.

belongs_to은 1-1 또는 1 대 다수 관계를 설정하고 모델 테이블에 외래 키 열을 배치합니다. users.id을 참조하는 경우에는 해당 houses.user_id :

class User < ActiveRecord::Base 
    has_one :house 
end 

class House < ActiveRecord::Base 
    belongs_to :user 
end 

둘째 사양 레코드가 순차적으로 생성되고 관건 안된다. 그것은 부서지기 쉬운 specs 및 주문 문제점을 창조 할 것이다. 대신에 공장에서 소녀가 당신을 위해 물건을 만드는 일을 맡게하십시오.

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