2011-03-03 2 views
8

이 쿼리를 수행하는 방법과 활성 레코드에서 arel을 사용하는 다른 방법을 파악하는 데 시간이 너무 많이 걸립니다.활성 레코드에 arel을 사용하여 관계를 계산합니다.

표면에
select users.id, 
     users.name, 
     maps.count as map_count, 
    from users 
    left join (select user_id, count(map_id) as count from maps_users group by user_id) maps on users.id = maps.user_id 

, 그것은 (http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/) 여기에 단지 닉의 예를 들면 다음과 같습니다

photo_counts = photos. 
group(photos[:user_id]). 
project(photos[:user_id], photos[:id].count) 

users.join(photo_counts).on(users[:id].eq(photo_counts[:user_id])) 

하지만 활성 레코드를 사용하는 레일에서 작동하지 않습니다. 나는 동등한 이런 식으로 뭔가해야한다고 생각하지만, 오류가 밖으로 :(

maps = Map.arel_table 
    map_counts = Map.group(maps[:owner_id]). 
        select(maps[:owner_id]). 
        select(maps[:id].count.as("map_count")) 
    users = User.joins(map_counts).on(User.arel_table[:id].eq(map_counts[:map_count])) 

을 수행하는 방법?

+0

어떤 오류가 발생합니까? 우리가 * 왜 * 오류가 있는지 알지 못한다면 정말 도움이되지 않습니다. –

답변

-2

그래, 그 기사는 정말 너무, Arel 마법을 배우고 싶은 만든 어떤 아이디어가.

Stackoverflow에 대한 "Arel 지능형 작업"에 대한 질문은 SQL로 대답하고 있습니다. 기사와 연구에서 Arel은 ActiveRecord가 아니라고 말할 수 있습니다. 동적 쿼리 작성에도 불구하고 Active에는 완전히 형성된 Arel 프로젝션의 결과를 매핑하는 권한.

,

당신은

https://github.com/activerecord-hackery/squeel 

하지만 부속 선택과 연산자를 지정할 수있는 기능을 얻을.

업데이트 : OMG, 나는이 질문에 5 년 전에 대답했습니다. 링크 농담은 죽었어 :)

+0

위 링크가 깨졌습니다. – shaheenery

1

먼저 프로젝트로 선택을 바꿉니다. 관계형 대수 SELECT (제한)는 WHERE 절입니다.

두 번째로 하위 선택을 할 수 있습니다.

sub_restriction = b. 
        where(b[:domain].eq(1)). 
        project(b[:domain]) 

restriction = a. 
       where(a[:domain].in sub_restriction) 

"하위 선택 사항"완료! :-)