다른 모델에 속하는 모델을 생성하는 방법에 대해 혼란스러워합니다. 내 책은이 구문을 사용하여 Micropost를 사용자와 연결합니다.
rails generate model Micropost user_id:integer
그러나 http://guides.rubyonrails.org/ 는 다음과 같이 말합니다.
rails generate model Micropost user:references
이 2에서 생성 된 마이그레이션은 다릅니다. 또한 전자의 user_id
경우 외래 키 참조를 레일이 어떻게 알 수 user
있습니까? 감사!
답변
마이그레이션을 실행할 때 둘 다 동일한 열을 생성합니다. 레일 콘솔에서 다음과 같은 경우를 볼 수 있습니다.
:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)
두 번째 명령 belongs_to :user
은 Micropost 모델에 관계를 추가 하지만 첫 번째 명령은 관계를 추가 하지 않습니다. 이 관계가 지정되면 ActiveRecord는 외래 키가 user_id
열에 유지된다고 가정 User
하고 특정 사용자를 인스턴스화하기 위해 명명 된 모델을 사용합니다 .
두 번째 명령은 새 user_id
열에 색인을 추가합니다 .
답변
Rails
user_id
는 외래 키 참조 라는 것을 어떻게 알 수user
있습니까?
Rails 자체는 그것이 user_id
외래 키 참조 라는 것을 모릅니다 user
. 첫 번째 명령에서는 rails generate model Micropost user_id:integer
열만 추가 user_id
하지만 레일은 col의 사용을 알지 못합니다. Micropost
모델에 선을 수동으로 넣어야합니다
class Micropost < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :microposts
end
키워드 belongs_to
와 has_many
이러한 모델 간의 관계를 결정하고 모델 user_id
의 외래 키로 선언 User
합니다.
이후 명령 은 모델에 rails generate model Micropost user:references
행 belongs_to :user
을 추가하고 Micropost
외래 키로 선언합니다.
참고
이전 방법을 사용하여 외래 키를 선언하면 모델 / 테이블과의 관계에 대해서만 Rails에 알릴 수 있습니다. 관계에 대한 데이터베이스를 알 수 없습니다. 따라서 소프트웨어를 사용하여 EER 다이어그램을 생성 할 때 MySql Workbench
모델간에 관계 스레드가 없다는 것을 알 수 있습니다. 다음 그림과 같이
그러나 이후 방법을 사용하면 마이그레이션 파일이 다음과 같은 것을 알 수 있습니다.
def change
create_table :microposts do |t|
t.references :user, index: true
t.timestamps null: false
end
add_foreign_key :microposts, :users
답변
전자의 경우 구성에 대한 규칙. 다른 테이블을 참조 할 때 레일스 기본값
belongs_to :something
를 찾는 것입니다 something_id
.
references
또는 belongs_to
몇 가지 단점으로 전자를 쓰는 새로운 방법입니다.
중요한 것은 외래 키를 만들지 않는다는 것을 기억하십시오. 그렇게하려면 다음 중 하나를 사용하여 명시 적으로 설정해야합니다.
t.references :something, foreign_key: true
t.belongs_to :something_else, foreign_key: true
또는 (복수 참고) :
add_foreign_key :table_name, :somethings
add_foreign_key :table_name, :something_elses`