2014-01-23 112 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,我想象用法會類似。