2014-01-23 72 views
0

我有一个实体报告集团通过和合并由

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

因为有与相同值的记录,但只有pos不同,我想通过key_idmergepos列组他们。这样做的

方式一:

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

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

Report.select("key_id,pos").group("key_id") 
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 

享受:)

0

这可能是昂贵的,但我想是这样你的情况,这是正确的解决方案。

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

你不说你在用什么数据库,但是在PostgreSQL中你可以做;

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

或类似的。

mysql有group_concat,我想象用法会类似。