[ruby-on-rails] user : references vs user_id : integer를 사용하여 모델 생성

다른 모델에 속하는 모델을 생성하는 방법에 대해 혼란스러워합니다. 내 책은이 구문을 사용하여 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_tohas_many이러한 모델 간의 관계를 결정하고 모델 user_id의 외래 키로 선언 User합니다.

이후 명령 은 모델에 rails generate model Micropost user:referencesbelongs_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

이제 외래 키는 데이터베이스 수준에서 설정됩니다. 적절한 EER다이어그램을 생성 할 수 있습니다 .
여기에 이미지 설명을 입력하십시오


답변

전자의 경우 구성에 대한 규칙. 다른 테이블을 참조 할 때 레일스 기본값

 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`


답변