[ruby-on-rails] “참조”마이그레이션에서 열 이름 지정

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

add_column :post, :user, :references

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



답변

수동으로 수행하십시오.

add_column :post, :author_id, :integer

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

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


답변

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입니다.


답변

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"


답변

레일 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의 일부)에서 제공됩니다 .


답변

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

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


답변

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)


답변