ActiveRecord::Base#group 执行 SQL GROUP BY。我想,但我不确定(取决于您的数据库适配器),因为您没有指定任何 SELECT 子句,所以您会获得每个类别的第一条记录。
为了达到你想要的,有不同的方法。
例如,使用#includes
:
Category.includes(:things).map do |category|
{
category_name: category.name,
things: things.sort_by(&:name).map{|t| {name: t.name} }
}
end.to_json
请注意,将模型序列化为 json 的标准(尽管经常不受欢迎)方法是使用(并在需要时覆盖)as_json 和 to_json。所以你会有一些类似的东西:
class Category < ActiveRecord::Base
def as_json( options = {} )
defaults = { only: :name, root: false, include: {links: {only: :name}} }
super( defaults.merge(options) )
end
end
像这样使用它:
Category.includes(:links).map(&:to_json)
编辑
由于 category_name 只是一列,您可以这样做:
Thing.order( :category_name, :name ).sort_by( &:category_name ).map do |category, things|
{ category_name: category, things: things.map{|t| {name: t.name} } }
end.to_json
这样的东西可能属于模型:
def self.sorted_by_category
order( :category_name, :name ).sort_by( &:category_name ).map do |category, things|
{ category_name: category, things: things.map{|t| {name: t.name} } }
end
end
所以你可以这样做:
Thing.sorted_by_category.to_json
这样,您甚至可以进一步确定范围:
Thing.where( foo: :bar ).sorted_by_category.to_json