Rails 마이그레이션 : t. 대체 이름이있는 참조?


121

그래서 저는 Schools at a School에 대해 다음과 같은 create_table을 가지고 있습니다.

create_table :courses do |t|
  t.string :name
  t.references :course
  t.timestamps
end

그러나 다음과 같은 두 가지 다른 코스 를 참조하고 싶습니다.

has_many :transferrable_as # A Course
has_many :same_as          # Another Course

다음과 같이 말할 수 있습니까?

t.references :transferrable_as, :as=> :course

답변:


161

초기 마이그레이션 / 컬럼 정의에서이 모든 작업을 수행 할 수 있습니다 (적어도 현재 Rails 5에서는).

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}

10
이것은 Rails 5.1에서 작동하며 다른 제안은 없습니다. 훨씬 깨끗하고 옳은 느낌입니다.
stephenmurdoch

2
Rails 5.1.4를 사용하지만 작동하지 않습니다. foreign_key이런 식으로 테이블 생성에 옵션을 지정하면 생성중인 테이블이 존재하지 않는다는 오류가 발생합니다. 그래서 공식 API에서 실제로 지원하지 않는 것 같습니다.
Quv


98

다음과 같이 할 수 있습니다.

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as
  t.references :same_as
  t.timestamps
end

또는 t.belongs_to별칭으로 사용t.references

foreign_key: true이 두 참조 라인에 추가 할 수 없습니다 . 데이터베이스 수준에서 외래 키로 표시하려면 다음을 사용하여 마이그레이션해야합니다.

add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id

최신 정보

Rails 5.1 이상에서는 다음과 같이 create_table블록 의 마이그레이션에 외래 키를 추가 할 수 있습니다 .

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as, foreign_key: { to_table: 'courses' }
  t.references :same_as, foreign_key: { to_table: 'courses' }
  t.timestamps
end

5
foreign_key: true참조 라인에 추가 할 수 없다는 부분 이 나를 괴롭 혔습니다. 추가하고 add_foreign_key열 이름을 지정하면 트릭이 발생했습니다.
매튜 클락

이것은 Rails에서 즉시 작동합니까? stackoverflow.com/a/22384289/239657 에 따르면 schema_plusgem 이 필요합니다 . 울타리' add_reference 문서에는 : references 옵션이 언급되어 있지 않습니다.
Beni Cherniavsky-Paskin

1
나는 references:옵션이 무엇인지를 따르지 않습니다 ( t.references모델 수준에서만 관련이 없으며 foreign_key 고려 사항은add_foreign_key 아닌가?
MCB

1
@MCB t.references는 "다른 테이블의 기본 키인이 테이블에 필드를 추가합니다."라고 말합니다. 이 references:옵션은 기본 키인 테이블을 알려줍니다 (필드 이름으로 명확하지 않은 경우 필요). 이 add_foreign_key함수는 여기서 참조 무결성을 적용하도록 데이터베이스에 지시합니다.
토비 1 케노비

2
@MCB는 결국 당신이 옳았다는 것을 깨달았습니다. 위의 첫 번째 주석은 정확히 맞습니다.이 add_foreign_key줄은 데이터베이스에 외래 키가 무엇인지 알려줍니다. references:매개 변수는 아무것도하지 않습니다.
Toby 1 Kenobi

13

이 스레드는 다른 Rails 방식이 있다고 생각합니다. Scaffolding ActiveRecord : 동일한 데이터 유형의 두 열

마이그레이션에서 :

t.belongs_to : transferrable_as

t.belongs_to : same_as


1
하지만 db는 테이블을 연결할 외래 키를 어떻게 알 수 있습니까? Postgres 데이터베이스로 이것을 PG::UndefinedTable: ERROR시도하고 있으며 존재하지 않는 테이블에 외래 키 제약 조건을 추가하려고 시도 하는 중 오류가 발생 합니다.
Toby 1 Kenobi

사람이 궁금해 경우, belongs_to그냥 별칭references등 동일한 기능이 있습니다.
Jason Swett

11

이 질문에 대한 추가 답변으로 모델에는 연결을 완료하기 위해 다음 줄이 있어야합니다.

    belongs_to :transferrable_as, class_name: "Course"
    belongs_to :same_as, class_name: "Course"

3

옵션을 references수락 하지 않는다고 생각 :as하지만 열을 수동으로 만들 수 있습니다.

create_table :courses do |t| 
  t.string  :name 
  t.integer :course1_id
  t.integer :course2_id 
  t.timestamps 
end 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.