[ruby-on-rails] Rails 4에서 참조 열 마이그레이션 추가

사용자에게 많은 업로드가 있습니다. 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 마이그레이션 : 참조 열을 추가 하시겠습니까?



답변

레일스 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 를 참조하십시오.


답변

레일 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


답변

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


답변

[레일 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


답변

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

rails g migration AddUserToUpload user:belongs_to


답변

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

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

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


답변

마이그레이션 파일 생성

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