我有一个实体报告
Report(id: integer, pos: integer, project_id: integer, key_id: integer, created_at: datetime)
由于记录具有相同的值,但只有pos
个不同,我希望按key_id
和merge
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"}
有更好的方法吗?
答案 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,我想用的就好了。