我有一个城市模型和一个商业模式。 商业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;真
这种方式效果很好。
答案 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