ActiveRecord组不返回带有对象数组的哈希值

时间:2018-07-18 13:51:02

标签: ruby-on-rails postgresql activerecord

我知道这个问题已经被问了很多。我有两个桌子Foo和Bar。

class Foo < ApplicationRecord
  belongs_to :bar
  ...

Foo具有idnamebar_id

属性

class Bar < ApplicationRecord
  has_many :foos
  ...

栏具有idname属性。

当我简单尝试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,并且随着记录的增加,它将大大降低查找速度。

1 个答案:

答案 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'}, ...],
 ...
}