我有两个型号。类别和照片。每个类别都有很多照片。
我想订购一个类别对象数组,使其按照Photo模型中的属性进行排序。具体来说,下载照片的次数。
我试图用
之类的东西启动实例变量@category = Category.active.order('photos.qty_download DESC)
然后我会使用该实例变量列出类别以及每个类别下载的照片数量
Chicago 45
San Fran 32
Boston 23
etc
什么表达式在Rails中有效?
由于
答案 0 :(得分:2)
让我们假设您的模型看起来像这样:
class Category < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :category
end
我们也假设:
qty_download
字段,如您所说
问题name
字段qty_download
的总和
类有了这些假设,你应该能够写
Category.
joins(:photos).
group("categories.id, categories.name").
select("categories.id, categories.name, sum(photos.qty_download) as total_downloads").
order("total_downloads desc")
请注意,将返回的内容将是&#34; partial&#34;仅包含id
,name
和total_downloads
的类别对象。如果您想要其他类别字段,请将其添加到group
和select
子句中。
<强> 更新 强>
较新版本的Postgres允许简化查询:
Category.
joins(:photos).
group("categories.id").
select("categories.*, sum(photos.qty_download) as total_downloads").
order("total_downloads desc")
请注意,在Postgres的最新版本中,您只需按唯一ID进行分组 - 您不再必须按照要包含在选择中的所有属性进行分组。因此,您现在可以将类别的所有属性包括为categories.*
。我会保留原件,因为它(略微)更有效,并且与旧版本的Postgres向后兼容。
答案 1 :(得分:0)
Category.includes(:photos).order(qty_download: :desc).reference(:photos)