사용자에게 많은 업로드가 있습니다. 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
당신은 때 이미 users
및 uploads
테이블과하고자하는 새로운 관계를 추가 그들 사이.
다음 명령을 사용하여 마이그레이션을 생성하기 만하면됩니다.
rails g migration AddUserToUploads user:references
마이그레이션 파일이 다음과 같이 생성됩니다.
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
그런 다음을 사용하여 마이그레이션을 실행하십시오 rake db:migrate
. 이 마이그레이션라는 새 열 추가 처리됩니다 user_id
에 uploads
테이블 (참조 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
. 키 id
는 users
테이블 의 열을 참조 합니다.
참고 : 이 여전히 필요하므로 참조를 추가하는 추가됩니다 먼저 외래 키 참조를 만들 ( 같은 마이그레이션 또는 별도의 마이그레이션 파일에서 외부 키를 만들 수 있습니다 ). 액티브 레코드는 단일 열 외래 키를 지원하며, 현재는 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