2014-02-11 14 views
1

我有一個展示位置模型,顯示僱員和他們的日誌的一個月位置結束分組散列的數組:如何返回由某個列

[<Placement id: 1, employee_name: 'John', month: "2014-02-01",position: 2>, 
<Placement id: 2, employee_name: 'John', month: "2014-01-01", position: 2>, 
<Placement id: 3, employee_name: 'Jill', month: "2014-02-01", position: 3>, 
<Placement id: 4, employee_name: 'Jill', month: "2014-01-01", position: 1> 
<Placement id: 5, employee_name: 'Fred', month: "2014-02-01", position: 1>] 

我怎麼會回到像哈希值的數組一個如下:

[ 
{ month: '2014-02-01', 'John': 2, 'Jill': 3, 'Fred': 1 }, 
{ month: '2014-01-01', 'John': 2, 'Jill': 1 } 
] 
+0

返回此類型的值,你可以用'jbulder' –

+0

這些都是無效的哈希。 –

+0

@thorstenmüller但我敢打賭你明白OP的要求。 –

回答

2
a = [ <Placement id: 1, employee_name: 'John', month: "2014-02-01",position: 2>, 
     <Placement id: 2, employee_name: 'John', month: "2014-01-01", position: 2>, 
     <Placement id: 3, employee_name: 'Jill', month: "2014-02-01", position: 3>, 
     <Placement id: 4, employee_name: 'Jill', month: "2014-01-01", position: 1> 
     <Placement id: 5, employee_name: 'Fred', month: "2014-02-01", position: 1> ] 

a.group_by(&:month).map do |month, data| 
    hash = {month: month} 
    data.each {|placement| hash[placement.employee_name] = placement.position} 
    hash 
end 
0

我建議你做數據庫分組,而不是代碼分組,因爲它更有效。

如果您使用mysql,你可以做到以下幾點:

(信貸:https://stackoverflow.com/a/14806663/226255

r = Placement.connection.select_all(
"select date_format(month, '%Y-%m') as monthy, 
    GROUP_CONCAT(Concat_Ws('=', employee_name, position)) AS place 
    from placements 
    group by year(month), month(month)") 

=> [{"monthy"=>"2014-01", "placement"=>"John=2,Jill=1"}, 
{"monthy"=>"2014-02", "placement"=>"John=2,Jill=3,Fred=1"}] 

檢查sqlfiddle這裏:現在 http://www.sqlfiddle.com/#!2/088e7/1/0

,在代碼,轉換爲與您的問題類似的散列:

r.map { |m| 
    h = { :month => m["monthy"] } 
    m["placement"].split(',').each { |i| 
    k, v = i.split('='); h[k] = v.to_i }; h 
} 

=> [{:month=>"2014-01", "John"=>2, "Jill"=>1}, 
{:month=>"2014-02", "John"=>2, "Jill"=>3, "Fred"=>1}] 
+0

這不行。 – ediblecode

+0

@jumpingcode爲什麼不呢?我只是試了一下,它確實收集了活動記錄對象的所有屬性 – Abdo

+0

是的,我也嘗試過,它的工作原理 –

0

您可以使用activemodel的串行as_json

例如,從文檔

user = User.find(1) 
user.as_json 
# => { "id" => 1, "name" => "Konata Izumi", "age" => 16, 
#  "created_at" => "2006/08/01", "awesome" => true} 

ActiveRecord::Base.include_root_in_json = true 

user.as_json 
# => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16, 
#     "created_at" => "2006/08/01", "awesome" => true } } 
+0

這些不是您要查找的值。 –

+0

是的,這是一個例子。我認爲他的哈希也是錯的 – AnkitG

0

試試這個,

placements = [<Placement id: 1, employee_name: 'John', month: "2014-02-01",position: 2>, 
    <Placement id: 2, employee_name: 'John', month: "2014-01-01", position: 2>, 
    <Placement id: 3, employee_name: 'Jill', month: "2014-02-01", position: 3>, 
    <Placement id: 4, employee_name: 'Jill', month: "2014-01-01", position: 1> 
    <Placement id: 5, employee_name: 'Fred', month: "2014-02-01", position: 1>] 

    placements.map!{|placement| placement.attributes} 
+0

我有一個類似的答案:'placements.map(&:attributes)';它看起來像OP,但是,正在詢問關於分組。 – Abdo

+0

是的,@BroiSatse會爲你節省時間! –

相關問題