그래서 저는 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
답변
초기 마이그레이션 / 컬럼 정의에서이 모든 작업을 수행 할 수 있습니다 (적어도 현재 Rails 5에서는).
t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
답변
다음과 같이 할 수 있습니다.
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
답변
이 스레드는 다른 Rails 방식이 있다고 생각합니다.
Scaffolding ActiveRecord : 동일한 데이터 유형의 두 열
마이그레이션에서 :
t.belongs_to : transferrable_as
t.belongs_to : same_as
답변
이 질문에 대한 추가 답변으로 모델에는 연결을 완료하기 위해 다음 줄이 있어야합니다.
belongs_to :transferrable_as, class_name: "Course"
belongs_to :same_as, class_name: "Course"
답변
옵션을 references
수락 하지 않는다고 생각 :as
하지만 열을 수동으로 만들 수 있습니다.
create_table :courses do |t|
t.string :name
t.integer :course1_id
t.integer :course2_id
t.timestamps
end