2012-04-03 2 views
4

가입 I I 최적 아니라는 것을 알고 다음과 같은 범위를 가지고 :복잡한 레일의 범위에 액티브

scope :event_stream_for, lambda{ |user| 
    where("target_id in (?) and target_type = ?", user.events.collect(&:id), "Event") 
} 

이 3 개 쿼리를 만듭니다. 어떻게 최적화 할 수 있습니까? 또한

, 나는

SELECT * FROM activities WHERE target_type =='Event' AND target_id IN (SELECT DISTINCT id FROM events WHERE (host_id == user.id OR invitee_id == user.id))

같은 범위의 람다에서 전체 SQL 문을 넣어 어떻게 당신

답변

4

가정 사용자가 많은 이벤트가 감사 각 이벤트는 사용자에 속한다.

scope :event_stream_for, lambda{ |user 
    joins(:events). # or joins("LEFT JOIN events ON events.user_id = users.id"). 
    where(["target_type=?", "Event"]) 
} 

이것은 하나의 쿼리를 실행합니다. 내 코드를 테이블로 테스트하지 않았지만 비슷하게 작동해야합니다.

----------------------- 수정 한 질문에 기반하여 ------------------ -

SELECT *하며 target_type == '이벤트'AND는 IN이

그것은 액티브에 대해 전부 ((HOST_ID == user.id 또는 invitee_id == user.id)이 이벤트 구별 ID를 선택) target_id 활동 관계는

Activity. 
select("*,distinct events.id AS events_id"). 
joins("events ON (events.host_id = #{user.id} OR events.invitee_id = #{user.id}"). 
where(:target_type => 'Event') 

http://railscasts.com/episodes/239-activerecord-relation-walkthrough?view=asciicast 콘솔에서이 작업을 시도하고 작동하는지 당신은 단지 범위를 변경할 수 있습니다. 내가 무엇을 하려는지 확실하지 않으므로 조정이 필요할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 내 user.events는 실제로 이벤트를 찾습니다. events.host_id == user.id 또는 events.invitee_id == user.id. 이 작업을 수행 할 레일 방법이 있습니까? – AdamNYC

1

어때?

이미 가지고있는 것을 재정렬 한 것이지만 코드에서 연관을 사용하지 않으므로 하나의 쿼리 만 가져야합니다.