Rails has_and_belongs_to_many는 비품과 공장과 혼동하고 있습니다
-
13-09-2019 - |
문제
일반적인 혼란
나는 3 장의 장르를 가질 수있는 밴드가 있습니다. 나는 a에서 읽었다 이전 SO 게시물 이것을 처리하는 올바른 방법은 몇 단계입니다.
1) Band.rb
has_and_belongs_to_many :genres
2) 밴드 genres 조인 테이블을 만듭니다
문서를 읽은 후에도 Habtm이 실제로 무엇을 의미하는지에 대해 약간 혼란스러워합니다. 나는 보통 "밴드에는 많은 장르가있다"고 생각할 것 같아요. 그래서 그것에 대한 빠른 멍청한 설명은 좋을 것입니다.
비품과의 혼동
또한 밴드 genres에 대한 내 비품을 할 때
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
그리고 나는 "알 수없는"밴드 열을 얻습니다. 나는 Rails가 "The Reaper Band"가 밴드 고정물의 밴드를 언급 할 것이라는 것을 알고 있다고 생각했고 (물론 동일한 이름) 그 ID를 잡고이 고정물의 "밴드"가 Join 테이블의 Band_id를 참조 할 것임을 알게 될 것입니다. . 오히려 내 비품은 하드 코딩 된 숫자보다 이렇게 보일 것입니다.
공장과의 혼란
공장에서 밴드를 만들 때 장르를 할당하고 싶습니다.
Factory.define :band do |f|
f.sequence(:name) { |n| "Band#{n}" }
f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
f.genres 2
end
나는 여기서 하드 코딩 된 장르 _id가 필요할 것이라는 것을 알고 있습니다. 그러나 왜 레일이 그것을보고 "아, 그는 밴드 genres 테이블에 ID = 2가있는 장르를 추가하고 싶다"고 말하지 않는 이유는 무엇입니까?
나는 철도가 나를 위해 모든 더러운 일을 돌볼 것을 기대하지는 않지만 규칙에 따라 플레이하고 싶습니다.
해결책
- 많은 사람들이 양방향으로 관계를 정의하고 속합니다. 밴드가 속한 장르 만 볼 필요가 있다면 Has_many는 괜찮을 것입니다. 어떤 밴드가 "Funk"인지 알고 싶다면 HABTM을 사용하여 주어진 장르의 밴드를 조회 할 수 있습니다.
- 비품의 경우, 레일에서 이제 조인 테이블에 대한 별도의 고정물을 만들지 않고 HABTM을 수행 할 수 있습니다. 예를 들어:
in bands.yml :
reaper_band:
name: The Reaper Band
genres: funk, rock
grenres.yml :
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band
제휴하지 않습니다 StackOverflow