"참조"마이그레이션에서 열 이름 지정


124

migration다른 테이블을 참조하여 Rails에서 만들고 싶습니다 . 일반적으로 다음과 같이합니다.

add_column :post, :user, :references

이것은라는 이름의 열 생성 user_idposts테이블을. 하지만, 대신에 user_id다음과 같은 것을 원하면 author_id어떨까요? 어떻게 할 수 있습니까?

답변:


59

수동으로 수행하십시오.

add_column :post, :author_id, :integer

하지만 이제는 belongs_to 문을 만들 때 수정해야하므로 이제 다음을 호출해야합니다.

def post
    belongs_to :user, :foreign_key => 'author_id'
end

1
색인을 추가 할 필요가 없습니까?
caarlos0

1
예, 마이그레이션시 인덱스를 만들어야합니다.
톰 해리슨

1
Rails 치트-기본적으로 인덱스를 사용하지 않습니다. 이제 인덱스를 원한다면 (레일이 완전히 무시한다는 사실에도 불구하고 좋은 생각입니다) 확실히 추가 할 수 있습니다. 일반적으로 마이그레이션에 대한 자세한 정보는 링크 가이드를 확인하고 마이그레이션에 직접 SQL 코드를 호출 할 수도 있습니다. Rails의 기본 생성 SQL 쿼리가 이점을 활용하지 않기 때문에 레일의 정상적인 부분이 아니기 때문에 무시한다고 말하고 싶습니다. 링크
mschultz

흠 이해했습니다. 대단히 감사합니다!
caarlos0

schema_plusgem을 사용하여 t.references :category, index: true, foreign_key: true, references: :match_categories마이그레이션 파일에서도 저를 위해 일했습니다.
elquimista 2016

251

Rails 5+ 용

초기 정의 :

Post모델 테이블을 정의하는 경우 references, indexforeign_key한 줄로 설정할 수 있습니다 .

t.references :author, index: true, foreign_key: { to_table: :users }

기존 업데이트 :

기존 테이블에 대한 참조를 추가하는 경우 다음을 수행 할 수 있습니다.

add_reference :posts, :author, foreign_key: { to_table: :users }

참고 : 의 기본값 index은 true입니다.


초기 정의가 널을 허용합니까? 그렇지 않다면 nullable 대안을 알고 있습니까?
Vorpulus Lyphane

5
이 정의는 nulls를 허용 합니다. 허용하지 않으려면 일반적인 옵션을 추가하세요 null: false.
Ashitaka 2017

감사. "Initial Definition"의 경우 "index : true"가 필요하지 않다고 생각합니다. 나는 그것의 유무에 관계없이 동일한 스키마 변경을 얻습니다. 신경 쓰지 마; 마지막에 메모를 봤습니다.
Joey

감사합니다, 이것이 제가 찾고 있던 것입니다!
Philippe B.

250

Rails 4.2 이상 에서는 db 에서도 외래 키 를 설정할 수 있습니다 . 이는 좋은 생각 입니다.

간단한 연결의 경우 t.references추가 할 때도 수행 할 수 foreign_key: true있지만이 경우 두 줄이 필요합니다.

# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id

# The model
belongs_to :author, class_name: "User"

2
감사합니다,하지만 문제는 내가 밖으로 바로 도와 드리겠습니다, Rails3 태그입니다
ecoologic

2
오, 나는 그것을 몰랐다. 글쎄, 그것은 나에게 매우 도움이되었습니다. :)
bonh

2
나는 이것을 보았을 때 희망을 거의 포기했습니다! @ecoologic 감사합니다!
Dan Williams

2
@ecoologic, 추가하고 싶은 한 가지, add_foreign_key는 레일 4.2 이상입니다. ;)
Dan Williams

4
전화 references: :users옵션 이 필요한지 잘 모르겠습니다 add_reference. 나는 문서에 문서화되어 있지 않으며 그것 없이는 내 끝에서 작동하는 것 같습니다.
jakecraige

87

레일 4에서는 postgresql과 schema_plus gem을 사용할 때 다음과 같이 작성할 수 있습니다.

add_reference :posts, :author, references: :users

이렇게하면 author_id올바르게 참조 하는 열이 생성 됩니다 users(id).

그리고 모델에서

belongs_to :author, class_name: "User"

새 테이블을 만들 때 다음과 같이 작성할 수 있습니다.

create_table :things do |t| 
  t.belongs_to :author, references: :users 
end 

참고 : schema_plusgem은 전체적으로 rails 5+와 호환되지 않지만,이 기능은 rails 5와 호환되는 gem schema_auto_foreign_keys (schema_plus의 일부)에서 제공됩니다 .


28
당신이 사용하는 경우 create_table:t.references :author, references: :users
마이클 Radionov

2
답변에 @MichaelRadionov의 의견을 추가하면 완벽하게 만들 수 있습니다.
toxaq

2
Rails 4.1 소스를 살펴 보았는데 :references실제로 어떤 일을하는 증거를 찾을 수 없습니다 .
jes5199

1
예, 맞습니다. 저는 오랫동안 schema_plus보석을 사용해 왔으며 실제로 그 기능을 추가하고 있습니다. 그에 따라 내 대답을 편집했습니다.
nathanvda

2
Rails 6에서는 t.references :col_name, references: other_table_name추가 gem을 설치하지 않고도 구문이 작동 하는 것처럼 보입니다 .
Qqwy

51

외래 키를 사용하지 않는 경우 다른 테이블의 실제 테이블 이름이 무엇인지는 중요하지 않습니다.

add_reference :posts, :author

Rails 5 부터 외래 키를 사용하는 경우 외래 키 옵션에서 다른 테이블의 이름을 지정할 수 있습니다. ( 토론 은 https://github.com/rails/rails/issues/21563 참조 )

add_reference :posts, :author, foreign_key: {to_table: :users}

Rails 5 이전에는 외래 키를 별도의 단계로 추가해야합니다.

add_foreign_key :posts, :users, column: :author_id

12
to_table은 복수 형식입니다.{to_table: :users}
hoffmanc

-3

alias_attribute (new_name, old_name) 는 매우 편리합니다. 모델과 관계를 만드십시오.

rails g model Post title user:references

그런 다음 모델을 편집하고 다음을 사용하여 속성 별칭을 추가합니다.

alias_attribute :author, :user

그 후에는 다음과 같은 것을 실행할 수 있습니다.

Post.new(title: 'My beautiful story', author: User.first)

1
다른 모델에 대한 여러 참조를 정의해야하는 경우에는 작동하지 않습니다 (예 : 게시 (저자, 편집자))
ultrajohn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.