0

꽤 기본적인 HABTM 관계를 쿼리하는 가장 좋은 방법을 이해하려고합니다. 나는 관련된 모든 훈련을 통해 모든 종족을 찾고 싶다. 중간에 HABTM 관계가 있기 때문에이 작업을 수행하는 가장 좋은 방법은 혼란 스러울뿐입니다.레일에서 HABTM을 통해 belongs_to를 쿼리하는 방법

class Discipline < ActiveRecord::Base 
    has_many :event_types 
end 

class EventType < ActiveRecord::Base 
    belongs_to :discipline 
    has_and_belongs_to_many :races 
end 

class Race < ActiveRecord::Base 
    has_and_belongs_to_many :event_types 
end 

감사합니다.

class Discipline < ActiveRecord::Base 
    has_many :event_types 
    has_many :races, through: :event_types 

그럼 그냥 전화 discipline.races :

+1

이 RailsCast (http://railscasts.com/episodes/47-two-many-to-many)를 확인하십시오 (http://stackoverflow.com/questions/9944542/rails-3-has-and). -belongs-to-many) 및이 퀴즈 ​​(http://www.codequizzes.com/learn-rails/many-to-many-relationships)를 참조하십시오. 그런 다음 스키마, 레일스 콘솔에서 시도한 코드 및 오류 메시지를 게시하십시오. BTW, StackOverflow에 오신 것을 환영합니다 :) – Powers

답변

1

event_types가 조인 된 경주에 대해 쿼리를 수행 할 수 있으며 where를 사용하여 discipline_id가 올바른 항목 만 포함 할 수 있습니다.

Race.joins(:event_types).where('event_types.discipline_id = ?', discipline.id) 

이 또는 당신이 인스턴스의 규율이있는 경우 당신은 ... 변수 discipline에로드 된 훈련을 가정 변수 @discipline 그에 따라 쿼리의 끝을 변경합니다.

+0

정확히 내가 무엇을 찾고 있었습니까. 고맙습니다! – Brent11

0

은 아마 이런 식으로 정의 할 수 있습니다.

하지 않으면, 나는 생각이 작동합니다 :

discipline.event_types.includes(:races).map { |e| e.races }.flatten 

map 각 결과에 대한 블록, 각 이벤트에 대한 따라서 인종의 결과로 새로운 배열을 반환합니다. flatten은 중첩 된 배열 (이벤트 유형 당 경주의 배열)을 평평한 경주 (단지 경주)로 만듭니다. 어쩌면 당신은 또한 uniq에 전화하기를 원할 것입니다. includes은 이벤트 유형당 하나가 아닌 한 번에 모든 레이스를로드합니다.

관련 문제