我知道这个问题已经被问了很多。我有两个桌子Foo和Bar。
class Foo < ApplicationRecord
belongs_to :bar
...
Foo具有id
,name
和bar_id
和
class Bar < ApplicationRecord
has_many :foos
...
栏具有id
和name
属性。
当我简单尝试Foo.group(:bar_id)
时,我会得到#<Foo::ActiveRecord_Relation:0x3fdeac1cc274>
使用Foo.group(:bar_id).count
,我得到{5=>2, 1=>2}
的键是bar_id
,值是具有该ID的数量的计数。
我想做的是,将Foo
的数组作为值在Bar#name
上将Foo
分组。
{
'name1' => [#<Foo:0x00007fbd5894f698 id:1, name: 'thing'...}, ...],
'name2' => [#<Foo:0x00017fbd5894f698 id:5, name: 'thing'...}, ...],
...
}
使用Foo.joins(:bar).group('bars.name').count
,我可以返回{"name1"=>2, "name2"=>2}
,但不能返回Foo模型的数组。我知道是因为数量。但不计入数,它只返回#<Foo::ActiveRecord_Relation:0x3fdeac1cc274>
我看到了很多使用Enumberable#group_by的建议。我不想使用枚举,因为我正在使用ActiveRecord,并且随着记录的增加,它将大大降低查找速度。
答案 0 :(得分:0)
我注意到您正在使用PostgreSQL。为什么不使用json aggregation函数呢?它与您想要的结果有些不同,但仍然包含相同的信息:
Bar
.joins(:foos)
.group("bars.name")
.pluck("bars.name", "json_agg(json_build_object('id', foos.id, 'name', foos.name))")
.to_h
结果将是:
{
'name1' => [{id:1, name: 'thing'}, ...],
'name2' => [{id:5, name: 'thing'}, ...],
...
}