Rails 4에서 참조 열 마이그레이션 추가


310

사용자에게 많은 업로드가 있습니다. uploads를 참조하는 테이블에 열을 추가하고 싶습니다 user. 마이그레이션은 어떤 모습입니까?

여기 내가 가진 것입니다. (1) :user_id, :int또는 (2)를 사용해야하는지 잘 모르겠습니다 :user, :references. (2)가 작동하는지 확실하지 않습니다. 이것을 "레일"방식으로하려고합니다.

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

Rails 3을 제외한 관련 질문 3. Rails 3 마이그레이션 : 참조 열을 추가 하시겠습니까?

답변:


706

레일스 4.x

당신은 때 이미 usersuploads테이블과하고자하는 새로운 관계를 추가 그들 사이.

다음 명령을 사용하여 마이그레이션을 생성하기 만하면됩니다.

rails g migration AddUserToUploads user:references

마이그레이션 파일이 다음과 같이 생성됩니다.

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

그런 다음을 사용하여 마이그레이션을 실행하십시오 rake db:migrate. 이 마이그레이션라는 새 열 추가 처리됩니다 user_iduploads테이블 (참조 id에서 열 users테이블), PLUS 또한 새로운 컬럼에 인덱스를 추가합니다.

업데이트 [For Rails 4.2]

레일은 참조 무결성을 유지하기 위해 신뢰할 수 없습니다. 관계형 데이터베이스 가 우리를 구출합니다. 즉, 데이터베이스 수준 자체 에 외래 키 제약 조건을 추가하고 데이터베이스 가이 참조 참조 무결성을 위반하는 작업을 거부 할 수 있습니다. @infoget이 언급했듯이 Rails 4.2외래 키 (참조 무결성) 를 기본적으로 지원합니다 . 필수는 아니지만 위에서 만든 참조에 외래 키를 추가하는 것이 좋습니다.

기존 참조 에 외래 키를 추가하려면 외래 키를 추가하기 위해 새 마이그레이션을 만듭니다.

class AddForeignKeyToUploads < ActiveRecord::Migration
  def change
    add_foreign_key :uploads, :users
  end
end

외래 키 를 사용하여 완전히 새로운 참조 를 만들려면 (Rails 4.2) 다음 명령을 사용하여 마이그레이션을 생성하십시오.

rails g migration AddUserToUploads user:references

마이그레이션 파일이 다음과 같이 생성됩니다.

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
    add_foreign_key :uploads, :users
  end
end

테이블 의 user_id열에 새로운 외래 키가 추가됩니다 uploads. 키 idusers테이블 의 열을 참조 합니다.

참고 : 이 여전히 필요하므로 참조를 추가하는 추가됩니다 먼저 외래 키 참조를 만들 ( 같은 마이그레이션 또는 별도의 마이그레이션 파일에서 외부 키를 만들 수 있습니다 ). 액티브 레코드는 단일 열 외래 키를 지원하며, 현재는 mysql, mysql2그리고 PostgreSQL어댑터가 지원됩니다. sqlite3등의 다른 어댑터로이 작업을 시도하지 마십시오 . 참조를 위해 Rails Guides : Foreign Keys 를 참조하십시오.


8
많은 경우 외래 키도 추가하는 것이 좋습니다. add_foreign_key (Rails 4.2)
poerror 2017 년

18
add_reference : uploads, : user, index : true, foreign_key : true @KirtiThorat
user1801879

32
이제 마이그레이션에 특수 생성기 구문을 사용하는 경우 Rails 4.2는 외래 키 제약 조건이 포함 된 올바른 마이그레이션을 자동으로 생성합니다. 적절한 마이그레이션으로 rails g migration AddUserToUploads user:references생성 add_reference :uploads, :user, index: true, foreign_key: true합니다.
jrhorn424

10
...index: true, foreign_key: true대신 o line을 사용하십시오 add_foreign_key.
Washington Botelho

2
우리는 왜 필요 둘 다 않습니다 foreign_keyt.reference? t.reference본질적으로 foriegn_key+ 와 같지 index않습니까?
geoboy

187

레일 5

여전히이 명령을 사용하여 마이그레이션을 작성할 수 있습니다.

rails g migration AddUserToUploads user:references

마이그레이션은 이전과 약간 다르게 보이지만 여전히 작동합니다.

class AddUserToUploads < ActiveRecord::Migration[5.0]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

그것의 참고 :user하지:user_id


2
같은 이름 간격 클래스에 대한 Local::User대신 User같은 무언가 rails g migration AddLocalUserToUploads user:references.
Ka Mok

3
이 자동으로 추가 않습니다:index
Saravanabalagi 라마 찬드에게

4
@Zeke 예, 마이그레이션을 실행하고 스키마를 확인하십시오.t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
Mirror318

1
Mirror318 @ P : 그래, 내가 가지고는 내가 수동으로 마이그레이션에서 add_index 등을 추가 오류 "인덱스가 존재"
Saravanabalagi 라마 찬드

2
우리는 또한 추가해야합니다 belongs_to :user에서 Upload우리가 사용할 수 있도록 클래스 upload.user사용자 인스턴스를 얻을 수 있습니다.
Wit

17

up및 다른 방법으로 다른 down방법을 사용하려면 다음을 시도하십시오.

  def up
    change_table :uploads do |t|
      t.references :user, index: true
    end
  end

  def down
    change_table :uploads do |t|
      t.remove_references :user, index: true
    end
  end

9

[레일 5 사용]

마이그레이션을 생성하십시오.

rails generate migration add_user_reference_to_uploads user:references

마이그레이션 파일이 생성됩니다.

class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

이제 스키마 파일을 관찰하면 업로드 테이블에 새 필드가 포함되어 있음을 알 수 있습니다. 같은 : t.bigint "user_id"또는 t.integer "user_id".

데이터베이스를 마이그레이션하십시오.

rails db:migrate

1
이 답변은 @ Mirror318의 답변과 중복 된 것으로 보입니다. 뭔가 빠졌다고 생각되면 위의 답변에 의견을주십시오. 감사.
M. Habib

8

동일한 작업을 수행하는 또 다른 구문은 다음과 같습니다.

rails g migration AddUserToUpload user:belongs_to

7

누군가 같은 문제가 있다면 문서화하십시오 ...

내 상황에서 필자는 :uuid필드를 사용하고 있으며 레일 5가 :bigint대신 열을 작성하기 때문에 위의 답변이 작동하지 않습니다 :uuid.

add_column :uploads, :user_id, :uuid
add_index :uploads, :user_id
add_foreign_key :uploads, :users

또한 무슨 일이 일어나고 있는지 더 명확합니다. 그러나 이제 UUID가 표준이되어야합니다.
hadees

2

마이그레이션 파일 생성

rails generate migration add_references_to_uploads user:references

기본 외래 키 이름

업로드 테이블에 외래 키로 user_id 열이 생성됩니다.

class AddReferencesToUploads < ActiveRecord::Migration[5.2]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

사용자 모델 :

class User < ApplicationRecord
  has_many :uploads
end

모델 업로드 :

class Upload < ApplicationRecord
  belongs_to :user
end

외래 키 이름을 사용자 정의하십시오.

add_reference :uploads, :author, references: :user, foreign_key: true

업로드 테이블에 외부 키로 author_id 열이 생성됩니다.

사용자 모델 :

class User < ApplicationRecord
  has_many :uploads, foreign_key: 'author_id'
end

모델 업로드 :

class Upload < ApplicationRecord
  belongs_to :user
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.