2011-09-08 28 views
0

我有一個城市模型和一個商業模型。 Business belogs_to:city如何找到所有有孩子的城市?

現在我想定義一個視圖,列出只有那些有孩子的城市(在這種情況下是商業)。不應該考慮空城市(意味着仍然沒有業務的城市)。如果可能的話,清單應該按照大多數企業位居前列的方式進行排序。

我發現了這樣一個解決方案:

@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" 

這工作正常(排序尚未完成),但據我瞭解,這將不使用Rails 3.1和3.2的工作(我用3.0現在) 。請參閱http://m.onkey.org/active-record-query-interface

任何人都可以讓我知道如何以Rails 3.1和3.2的方式定義我的@cities嗎?

謝謝!

@KandadaBoggu:

太好了,我非常喜歡你的答案2),謝謝!

只是評論:

我 軌道遷移產生遷移add_businesses_count_to_cities businesses_count:整數

然後我需要編輯的遷移:

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,然後用當前的企業數量更新城市。

我還添加了counter_cache孩子(業務),如: belongs_to的:城市:counter_cache =>真

這樣,它的偉大工程。

回答

3

1)在不排序:

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

2)使用counter_cache

一個integer柱稱爲business_count添加到cities表。

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) 
相關問題