【问题标题】:Group by array column values in Rails-5在 Rails-5 中按数组列值分组
【发布时间】:2019-06-24 07:28:31
【问题描述】:

我有一个有趣的问题

我想按表格的数组列中的单个值进行计数

例如

对于用户模型

id |  community_ids
1  |  {2, 4}
2  |  {2, 5} 
3  |  {2, 4}

我想说

Community| User count
  2      | 3
  4      | 2
  5      | 1

我有办法

User.
  pluck(Arel.sql('unnest(community_ids) as community_id')).
  group_by(&:itself).
  transform_values(&:count)

但问题是我正在遍历所有用户

谢谢

【问题讨论】:

  • Community 是用户belongs_to :community 的模型吗?还是community_ids 是数据类型数组?
  • 这就是为什么我通常不使用数组列的原因,除非我绝对确定我不必对其应用条件。因为那并不总是很容易。现在对于您的问题,无论如何您都必须遍历所有用户,无论是在 SQL 中还是在 ruby​​ 代码中,如果我是您,我可能会编写一些自定义 sql 来为我执行此操作。对于较大的数据集,这仍然不会很快。
  • 值是否已知并限制在数组列中?如果是这样,那将使它更容易和更有效。

标签: ruby-on-rails postgresql ruby-on-rails-5


【解决方案1】:

SQL 版本可能类似于:

SELECT unnest(community_ids) AS community_id, count(*) AS count
FROM users 
GROUP BY community_id;

将它映射到 Rails AR 也很简单,它可以通过不同的方式完成,我会做最简单的方式:

sql = "SELECT unnest(community_ids) AS community_id, count(*) AS count
FROM users 
GROUP BY community_id"
results = ActiveRecord::Base.connection.execute(sql).to_a
# results should look something like: [{"community_id"=>2,"count"=>3}...]

PS:这个方法取自here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多