5

단일 "계정"테이블과 함께 STI 모델을 사용하여 사용자 및 기술자를위한 정보를 보유하고 있습니다 (예 : 사용자 < 계정, 기술자 < 계정). 모든 기능적인 관점에서 작동하지만, 일이 실행 단위 테스트 폭발 :Ruby on Rails 단일 테이블 상속 (PostgreSQL과 함께)

... 8) 오류 : test_the_truth (UserTest) : 액티브 :: StatementInvalid가 : PGError : 오류 : 관계 "기술자"가 존재하지 않습니다 : ... "기술자" 에서 삭제

기본적으로 표준 프레임 워크는 기술자 및 사용자 테이블 (또는 PostgreSQL의 그들을 호출로 "관계") 사실 존재하지 않는 인식하지 못해야 계정에 별명을 지정하십시오.

아이디어가 있으십니까? 저는 RoR에 비교적 익숙하지 않습니다. STI를 모두 제거하지 않고이를 해결하는 방법에 대해 저는 분실했습니다.

+0

오류를 생성하는 단위 테스트와 오류 발생시 호출하는 메서드를 게시 할 수 있습니까? –

답변

12

문제가의 존재 때문이라고 밝혀 프레임 워크는 이름이 비슷한 테이블에 데이터를 삽입 할 수 있어야합니다.

+1

<3 스택 오버 플로우. 내가 너를 더 기댈 수 있으면 좋겠다! – nfm

0
  • 계정 테이블에 '유형'열이 있는지 확인 했습니까? STI를 작동 시키려면 하나가 필요합니다.
  • 저는 실제로 'type'이라는 열과의 데이터베이스 호환성 문제가 있었으며이를 완화하기 위해 'kind'로 전환하기도했습니다. 그것은 문제 일 수 있습니다. 기본 클래스 (Account)에서 self.inheritance_column = "kind"를 설정하고 도움이되는지 확인하십시오.

    ./test/fixtures/technicians.yml ./test/fixtures/users.yml

    이이 같은 의미가 있습니다 :

+0

계정에 "유형"열이 포함되어 있었지만 불행히도 "kind"로 이름을 변경하면 귀하의 제안이 도움이되지 않습니다. 문제는 지속됩니다. –

2

자식 모델의 YAML 파일을 제거하여 비슷한 문제가 해결되었습니다. 본질적으로 레일즈는/test/fixtures /에서 생성 된 조명기를보고, 각각을 위해 테이블을 비우려고합니다. 그래서 테이블을 다시로드 할 수 있습니다.

내 경우에는 새로운 fixture를 자동 생성하는 script/generate model 명령을 실행했습니다. 그런 다음 모델을 변경하여 적절한 부모 클래스에서 상속받습니다. 고정 장치가 여전히 존재했기 때문에 레일은 고정 장치를로드하기 전에 자식에서 삭제하려고했습니다.

실제로 데이터를 미리로드해야하는 경우 상위 모델 고정 장치를 사용하고 유형 필드를 적절한 모델 이름으로 설정해야합니다.