2009-07-13 2 views
0

자연스러운 ActiveRecord 관계로 갖고 싶은 약간 복잡한 쿼리가 있습니다. 현재 @ calendar.events와 @ calendar.shared_events를 호출하고 배열을 결합하고 정렬합니다. 통합이 SQL로 할 수있다 :ActiveRecord 관계에서이 sql 쿼리를 어떻게 표현 하시겠습니까?

SELECT calendar_events.* FROM calendar_events left outer join calendar_events_calendars on calendar_events_calendars.calendar_event_id = calendar_events.id where calendar_events.calendar_id = 2 or calendar_events_calendars.calendar_id = 2 

하지만 나는 액티브 관계로 이것을 표현하는 방법을 모르겠어요. 사용자 지정 SQL 찾기를 사용할 수 있지만 결과에 범위를 사용할 수 있기를 바랍니다.

현재 이벤트가 하나의 일정에 속하고 또한 조인 HABTM를 통해 많은 다른 달력에 속하는 테이블 :

has_and_belongs_to_many :shared_events, :class_name => 'CalendarEvent', :order => 'beginning DESC, name' 
    has_many :events, :class_name => 'CalendarEvent', :dependent => :destroy, :order => 'beginning DESC, name' 

모든 포인터는 크게 감상 할 수있다 :)

답변

0

당신은 우리가 데이터를 이해하는 데 도움이 조금 더 구조가 필요해? HABTM 또는 has_many를 통해 달성 할 수없는 두 가지 관계 (has_many/belongs_to 및 HABTM)로 달성하려는 것은 무엇입니까? 데이터 모델의 단순화가 사용자가 수행 한 결과를 얻는 것처럼 보입니다. (죄송합니다 - 충분하지 않은 점이나 주석으로 추가 한 것)

--UPDATED COMMENT

나는 당신이 당신의 코멘트에서 제시 한 것은 궁극적으로 더 나은 해결책이라고 생각 AFTER. 그것 입니다. 구현을 시작한 방법은 가능하지만 불필요하게 복잡합니다. 경험상 ActiveRecord를 사용하여 잘못된 경로를 사용할 때 복잡하고 중복 된 관계를 시작할 때 종종 알 수 있습니다. 이름.

이유는 a) 이러한) 주/주 부착 (또는 그 반대 인 것을 지정하는 조인 테이블에 추가 필드를() b) 양방향 관계 통하여, has_many에 모두 갖고 있지 .

그런 다음 지정된 조인에 조건을 포함하여 마법을 수행하는 공유 이벤트 등을 위해 이벤트 모델에 명명 된 범위를 지정할 수 있습니다. 이것은 당신에게 준다 :

@calendar.events #returns all events across the join 
@calendar.shared_events #where the 'shared' flag on the join is set 
@calendar.main_events #without the flag 
+0

그것은 좋은 질문이다. 각 일정은 하나의 일정에 속하지만 다른 일정에 연결할 수 있습니다. 나는 has_many : through를 수행 할 수 있었고 이벤트가이 달력에 의해 소유되었는지 여부를 나타 내기 위해 조인 테이블에 부울 열의 일종을 설정했지만 너무 섬세하게 보였다. 이벤트가 하나의 캘린더에 속한 것이 분명하며, 필요한 경우 다른 사람들과 연결할 수도 있습니다. 나는 그것이 새로운 사건을 문제가되게 만들 것이기 ​​때문에 activerecord가 그런 관계를 허용 할 수없는 이유를 이해한다. –

+0

고마워. :) 나는 그렇게하기 위해 열심히 노력했다. 그러나 결국 나는 당신 자신의 길로 가야했다 :) 실제로 suprisingly 히 쉬웠다! 캘린더에 이벤트를 할당하는 프로세스를 제외하고. 나는 그 목적을 위해 또 다른 질문을 만들었습니다. –

관련 문제