Active Record의 has_and_belongs_to_many와 has_many :

소개



안녕하세요.
금요일 밤입니다. 내일이 휴일이라고 생각하면 아침 일어나지 않아도 되니까요. 마음 밖에 여러가지 뿌릴 것 같아요.
하지만 슬슬 자고 싶기 때문에 하루 하나 Qiita를 남기고 꿈의 나라로 여행을 하려고 합니다.

이 기사에서 쓰기



Active Record 협회 (공식 railsguides에 대한 링크를 붙여 둡니다)has_and_belongs_to_many 의 구현 코드를 읽어 보고 눈치챈 것을 힘들게 쓴다.

배경



다 대다 연관을 표현할 때 has_and_belongs_to_many 또는 has_many :through 어느 것을 선택합니까? 했습니다.
그러니까, 실체의 중개 테이블을 가져, 거기에 2개의 다대다의 관계를 가지는 모델의 id를 세트로 보존해 관련을 표현하고 있었군요.
하지만 지금 바로 다대다 관련을 갖게 될 것 같은 모델이 있어, has_and_belongs_to_many 사용하고 있는 왜? has_and_belongs_to_many 를 사용하지 않는 이유가 있다고? 라고 PR로 질문되었을 때 자신은 명확하게 이유를 응할 수 없고, 그것이 계기로, 이 2개의 방법에 대해서 확실히 생각하려고 생각했습니다.
※세상(google 선생님이 준비하고 있는 세계)에서 has_many :through 그만두자! 라는 의견이 많은 것도 보았습니다.
하지만 여기에서는 특히 세상 여러분이 말씀하신 내용을 그렇게 생각한다는 것을 쓰는 것이 아니라, 어디까지나 코드를 따라 자신이 이해할 수 있었던 것, 할 수 없는 것, 그 위에의 2개의 차이에 대해 정리해 가면 좋겠다고 생각합니다.

좋아, 좋다.



이 방법에 대해 읽은 결과라는 소감


  • 모델명 언제나 어느 쪽이 복수였던 듯이 migrate 할 때 생각하고 싶었지만 여기를 잘 이해.
    htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / b13 아 5cb83 에어 00d6 아 3d71320fd276 또는 21049c2544 / 맘 l에서 r /는 s_an d_been gs_와 _ma ny. rb # L65
  • 중간 테이블명에 대해서도 마찬가지.
    htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / b13 아 5cb83 에어 00d6 아 3d71320fd276 또는 21049c2544 / 맘 l에서 r /는 s_an d_been gs_와 _ma ny. rb # L95
  • 내부적으로는 has_and_belongs_many 를 사용하고 있다.
    htps : // 기주 b. 이 m/라이 ls/라이 ls/bぉb/0 아 f3dd4438047d8c5783df1cfcf9c696b44bdf/아 ゔぇ레코 rd/ぃb/아치 ゔぇ_레코 rd/아소. rb # L1720
  • left와 right 각각으로 다른쪽에 has_many 하고 있다
    htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / b13 아 5cb83 에어 00d6 아 3d71320fd276 또는 21049c2544 / 맘 l에서 r /는 s_an d_been gs_와 _ma ny. rb # L59
  • 내부적으로 Class를 new 하고 있다. 그 new되는 클래스가 관련을 표현하는 중간 모델.
    htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / b13 아 5cb83 에어 00d6 아 3d71320fd276 또는 21049c2544 / 맘 l에서 r /는 s_an d_been gs_와 _ma ny. rb#L14
  • macro가 어디에 정의되어 있는지 한순간 몰랐다. 그렇지만 인스턴스 메소드로 곧 raise 하고 있었으므로, 계승하고 있는 앞에서 정의하고 있다고 생각해 가면 belongs_to 에서 발견할 수 있어서 좋았다.
    https://魏Tub. 소 m/来 ls/来 ls/bぉb/b2 그림 b1d1c55 아 소리 s/부위 l에서 r/는 s_참ny. rb#L5
  • 이 일행은 왠지 굉장히 깔끔하고 좋다고 생각했다. 자신도 여기 사용해 보면 좋을지도 모르는 때 사용해 가고 싶다.
    htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / b13 아 5cb83 에어 00d6 아 3d71320fd276 또는 21049c2544 . rb # L18
  • 이 일행 무엇을 하고 있는 거야? HasMany 관련을 만들기 위해 reflection을 만들려면 여기에서해야합니까? 모르겠어요.
    htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / b13 아 5cb83 에어 00d6 아 3d71320fd276 또는 21049c2544 / 맘 l에서 r /는 s_an d_been gs_와 _ma ny. rb # L69

  • 수수께끼가 남았다.



    오늘은 HasMany 에 대해서 달려서 밖에 할 수 없었습니다.
    「그 1」이라고 타이틀을 붙인 이상, has_and_belongs_to_many 에 대한 코드도 내일 읽고 싶습니다. 그림이라도 정리할까. .
    그럼 이번 주도 평일 수고하셨습니다.
    잘자. 좋은 밤을.
    Happy coding!

    좋은 웹페이지 즐겨찾기