我怎样才能找到所有有孩子的城市?

时间:2011-09-08 15:46:35

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个城市模型和一个商业模式。 商业belogs_to:城市

现在我想定义一个视图,其中只列出那些有孩子的城市(在这种情况下是一个商业)。不应考虑空城市(指尚未增加业务的城市)。如果可能,列表应按照大多数企业所在城市排在最前面的方式进行排序。

我找到了这样的解决方案:

@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),谢谢!!

只是评论:

我迁移了 rails生成迁移add_businesses_count_to_cities enterprises_count:integer

然后我需要编辑迁移:

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:city,:counter_cache =&gt;真

这种方式效果很好。

1 个答案:

答案 0 :(得分:3)

1)没有排序:

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

2)使用counter_cache

将一个名为integer的{​​{1}}列添加到business_count表。

cities

现在您可以按如下方式选择城市:

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

3)使用City.where("business_count > 0").order(:business_count)

group by