2011-09-08 3 views
0

도시 모델과 비즈니스 모델이 있습니다. 비즈니스 belogs_to : 도시어린이가있는 모든 도시를 어떻게 찾을 수 있습니까?

이제는 자녀가있는 도시 목록 (이 경우 비즈니스)을 정의하고자합니다. 빈 도시 (비즈니스가 추가되지 않은 도시)는 고려되어서는 안됩니다. 가능한 경우 목록은 대부분의 비즈니스가있는 도시가 맨 위에 오도록 정렬해야합니다. 이것은 (정렬이 아직 완료되지 않음) 잘 작동하지만 지금까지 내가 레일 3.1 및 3.2에서 작동하지 않습니다이 이해로 (지금은 3.0을 사용)

@cities = City.find :all, 
     :joins => "INNER JOIN businesses ON businesses.city_id = cities.id", 
     :select => "cities.*, count(businesses.id) businesses_count", 
     :group => "businesses.city_id HAVING businesses_count > 0", 
     :order => "businesses_count desc" 

:

는이 같은 해결책을 발견 . http://m.onkey.org/active-record-query-interface

누구든지 내 @ cities를 레일 3.1 및 3.2에서 확인하는 방법을 어떻게 알 수 있습니까?

감사합니다.

@KandadaBoggu :

좋아요, 내가 아주 많이 답변 2 등), 감사!

그냥 코멘트 : 나는 레일 마이그레이션

마이그레이션 add_businesses_count_to_cities가 businesses_count 생성 : 정수 I 마이그레이션 편집하는 데 필요한 다음

:

class AddBusinessesCountToCities < ActiveRecord::Migration 
    def self.up 
    add_column :cities, :businesses_count, :integer, :default => 0 

    City.reset_column_information 

    City.all.each do |c| 
     c.update_attribute :businesses_count, c.businesses.count 
    end 
    end 

    def self.down 
    remove_column :cities, :businesses_count 
    end 
end 

이 기본 값을 설정하는 것이 중요합니다을 0을 입력 한 다음 도시를 현재 비즈니스 수로 업데이트하십시오. belongs_to :

는 또한 같은 아이 (사업)에 counter_cache을 추가 도시 : counter_cache =>

이 방법은 사실은 잘 작동합니다. 정렬없이

답변

3

1) : counter_cache

cities 테이블에 business_count라는 integer 열을 추가하여

City.joins(:businesses).select("DISTINCT cities.*") 

2). 다음과 같이

class City < ActiveRecord::Base 
    has_many :businesses, :counter_cache => :business_count 
end 

이제 도시를 선택할 수 있습니다 사용

City.where("business_count > 0").order(:business_count) 

3) group by

City.joins(" 
    (SELECT a.id, COUNT(*) as business_count 
    FROM cities a, businesses b 
    WHERE a.id = b.city_id 
    GROUP BY a.id 
    ) c ON cities.id = c.id "). 
select("cities.*, c.business_count AS business_count"). 
order(:business_count) 
관련 문제