按列分组并按列合并

时间:2014-01-23 10:41:44

标签: ruby-on-rails activerecord ruby-on-rails-4

我有一个实体报告

Report(id: integer, pos: integer, project_id: integer, key_id: integer, created_at: datetime)

由于记录具有相同的值,但只有pos个不同,我希望按key_idmerge pos列对它们进行分组。

一种做法:

Report.group(:key_id, :pos).select(:key_id, :pos) OR .size

并循环抛出每一个,如果key_id上有匹配,则添加新的pos

预期产出:

 1. {"key" => "key_id", "pos" => "pos"}
 2. {"key" => "key_id", "pos" => "pos1"}
 Result => {"key" => "key_id", "pos" => "pos, pos1"}

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

[{"key" => "key_id", "pos" => "pos"}, {"key" => "key_id", "pos" => "pos1"}].group_by { |hash| hash[:id] }.map do |id, hashes|
  hashes.reduce do |a, b|
    a.merge(b) { |key, v1, v2| v1 == v2 ? v1 : [v1, v2].flatten }
  end
end

享受:)

答案 1 :(得分:0)

试试这个,它可能适合你。

Report.select("key_id,pos").group("key_id")

答案 2 :(得分:0)

这可能代价高昂,但我认为在您的情况下这是正确的解决方案。

result = {}
Report.group(:key_id).count.keys.each do |report|
    result[report] = Report.where(:key_id => report).map(&:pos).join(", ")
end

答案 3 :(得分:0)

你没有说你正在使用什么数据库,但在PostgreSQL中你可以这样做;

Report.select(:key_id, 'array_agg(pos)').group(:key_id).pluck(:key_id, 'array_agg(pos)')

或类似。

mysql有group_concat,我想用的就好了。