[ruby-on-rails] Rails 마이그레이션 : t. 대체 이름이있는 참조?

그래서 저는 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 


답변