2010-11-24 4 views
0

내 애플 리케이션에서 다음과 같은 모델을 (관련 범위를 보여주는) :Rails & Postgres - 카운트 열이있는 쿼리가 실제로 복잡합니까?

class Audition < ActiveRecord::Base 
    def self.with_new_applications 
    columns = self.column_names.map{|c| "auditions.#{c}" }.join(', ') 

    select(columns).joins(:applications).merge(Application.unreplied).group(columns) 
    end 
end 

class Application < ActiveRecord::Base 
    def self.unreplied 
    columns = Application.column_names.map{|c| "applications.#{c}" }.join(', ') 

    select("#{columns}, count(messages.id) as message_count"). 
     joins('left outer join messages on messages.application_id = applications.id'). 
     group(columns). 
     having('count(messages.id) = 0') 
    end 
end 

postgreSQL을 사용하기 때문에 쿼리가 불필요하게 복잡해진 것처럼 보입니다. count 열/그룹화를위한 열.

뭔가 빠졌습니까? 나에게 레일스처럼 보이지는 않습니다.

이러한 쿼리를보다 간단한 방식으로 실행할 수 있습니까?

고맙습니다

+0

PostgreSQL에서 MySQL과 같이 쿼리가 더 복잡한 이유는 무엇이라고 생각하십니까? ANSI-SQL은 ANSI-SQL이며 두 데이터베이스 모두에서 간단한 COUNT가 동일합니다. –

+0

@ Frank Heikens : MySQL에서 숨겨진 열을 GROUP BY : http://dev.mysql.com/과 함께 사용할 수 있음을 의미한다고 생각합니다. doc/refman/5.0/ko/group-by-hidden-columns.html하지만 PostgreSQL에서는 모든 열을 나열하거나 다른 방법으로 쿼리를 작성해야합니다. –

+0

꽤 많이 PostgreSQL을 사용하면 각 쿼리를 사용하여 수동으로 열을 입력해야한다는 것이 이상하게 보입니다. 어쩌면 나는 ActiveRecord/ARel 매직에 의해 버릇이 없으므로 겉보기에 단순한 작업이 더 복잡 해지면 이상하게 보일 수 있습니다. 레일스의 앞면에는 더 우아한 해결책을 찾기 위해 다르게 할 수있는 것이 있습니까? –

답변

2

는 액티브 사용하여 완전히 다른 각도에서 문제를 접근 할 수 : counter_cache를? 예 :

belongs_to :application, :counter_cache => true 

어쩌면 짧고 간단하며 효율적인 쿼리를이 방법으로 사용할 수 있습니다.

+0

그건 훨씬 좋은 방법입니다. 건배 –