user : references vs user_id : integer를 사용하여 모델 생성


176

다른 모델에 속하는 모델을 생성하는 방법에 대해 혼란스러워합니다. 내 책은이 구문을 사용하여 Micropost를 사용자와 연결합니다.

rails generate model Micropost user_id:integer

그러나 http://guides.rubyonrails.org/ 는 다음과 같이 말합니다.

rails generate model Micropost user:references

이 2에서 생성 된 마이그레이션은 다릅니다. 또한 전자의 user_id경우 외래 키 참조를 레일이 어떻게 알 수 user있습니까? 감사!

답변:


190

마이그레이션을 실행할 때 둘 다 동일한 열을 생성합니다. 레일 콘솔에서 다음과 같은 경우를 볼 수 있습니다.

:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)

두 번째 명령 belongs_to :user은 Micropost 모델에 관계를 추가 하지만 첫 번째 명령은 관계를 추가 하지 않습니다. 이 관계가 지정되면 ActiveRecord는 외래 ​​키가 user_id열에 유지된다고 가정 User하고 특정 사용자를 인스턴스화하기 위해 명명 된 모델을 사용합니다 .

두 번째 명령은 새 user_id열에 색인을 추가합니다 .


1
두 개의 테이블을 참조하여 모델을 생성 할 수 있습니까
praveenkumar

추가하려는 다른 모델 (사용자)에 has_many 연관을 추가하지 않습니다.
Sv1 2016 년

45

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다이어그램을 생성 할 수 있습니다 . 여기에 이미지 설명을 입력하십시오


1
최신 Rails 생성기는 add_foreign_key작업을 라인 의 옵션 foreign_key: true으로 대체 한 것으로 보입니다 . 그래서 지금 입니다. 현재 사용 가능한 옵션에 대한 설명서가 없으므로 이것은 내 가정 일뿐입니다. t.referencesindex: truet.references :user, foreign_key: trueforeign_key
Franklin Yu

오, add_reference액션 에는 적절한 외래 키 제약 조건:foreign_key추가하는 옵션이 있습니다 . 테이블을 만들 때이 옵션이 동일하게 작동한다고 생각합니다.
Franklin Yu

루비 DB를 어떻게 워크 벤치로 내보내나요? 여기에 대답
하시겠어요

필요합니까 add_foreign_key :microposts, :users 레일에 대한 모든 차이를 만들어?
Linus

17

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

 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`

1
참조가 외래 키를 생성하지 않는다는 말로 무엇을 의미하는지 설명 할 수 있습니다. user_id : integer를 직접 사용하는 첫 번째 명령과 어떻게 다른가요?
shailesh

:polymorphic옵션 을 사용하는 경우를 제외하고는 아닙니다 (대부분의 경우 IMHO는 좋은 생각이 아닙니다). ActiveRecord에서 외래 키를 사용하려면 foreigner를 사용하십시오 .
Krule

1
@Krule Now add_foreign_key는 ActiveRecord로 만들었습니다.
Franklin Yu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.