migration
다른 테이블을 참조하여 Rails에서 만들고 싶습니다 . 일반적으로 다음과 같이합니다.
add_column :post, :user, :references
이것은라는 이름의 열 생성 user_id
에 posts
테이블을. 하지만, 대신에 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
, index
및 foreign_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_plus
gem은 전체적으로 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)