2016-05-04 13 views
1

私はレールオブジェクトnetwork_hostsを持っています。私のアプリケーションのすべてのネットワークホストを返します。今、host.os_vendorの内訳(Linux、Windows、Appleなど)を示すMorris.js donut chartを作成したいと思います。Railsオブジェクト配列を反復してキー/値のペアを作成する

オブジェクトを反復処理し、OSタイプを抽出し、type countを作成し、Morris.jsがドーナツチャートを作成するために使用するdata属性に戻すには、どうすればよいでしょうか?ここで

network_hostsのための出力のサンプルです:

[#<NetworkHost id: 80, location_id: 14, mac_address: "70:56:81:C1:7C:FD", ip_address: "10.10.10.122", hostname: "Air1", created_at: "2016-04-14 19:30:20", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Unknown", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 10, location_id: 14, mac_address: "C8:E0:EB:3D:2B:B7", ip_address: "10.10.10.129", hostname: "iMac2", created_at: "2014-11-25 23:20:41", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Unknown", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 29, location_id: 14, mac_address: "18:B4:30:15:BC:63", ip_address: "10.10.10.130", hostname: "02AA01AC4414076R", created_at: "2015-02-26 02:24:32", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Nest Labs", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 30, location_id: 14, mac_address: "00:04:20:F0:6E:9F", ip_address: "10.10.10.135", hostname: "HarmonyHub", created_at: "2015-02-26 02:24:32", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Linux", nickname: nil, vendor: "Slim Devices", os: "Linux 2.6.17 - 2.6.36", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 2, location_id: 14, mac_address: "DC:9F:DB:E6:CB:A9", ip_address: "10.10.10.100", hostname: "office", created_at: "2014-11-25 23:20:41", updated_at: "2016-05-03 18:30:36", deleted_at: nil, os_vendor: "Unknown", nickname: "Who 1", vendor: "Ubiquiti Networks", os: "Unknown", ignore_date: "2016-05-30 00:09:00", ignore_flag: false>, 
 
#<NetworkHost id: 27, location_id: 14, mac_address: "74:54:7D:02:53:8C", ip_address: "10.10.10.101", hostname: "Hostname Unknown", created_at: "2015-02-26 02:24:32", updated_at: "2016-05-03 18:30:36", deleted_at: nil, os_vendor: "Linksys", nickname: nil, vendor: "Unknown", os: "Linksys WET54G wireless bridge", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 76, location_id: 14, mac_address: "D0:63:B4:00:5B:40", ip_address: "10.10.10.106", hostname: "OpenELEC", created_at: "2016-02-19 01:03:24", updated_at: "2016-05-02 17:08:28", deleted_at: nil, os_vendor: "Unknown", nickname: "OpenElec", vendor: "Unknown", os: "Unknown", ignore_date: "2016-06-01 17:07:50", ignore_flag: false>, 
 
#<NetworkHost id: 11, location_id: 14, mac_address: "84:34:97:1C:42:50", ip_address: "10.10.10.137", hostname: "HP1A4DC4", created_at: "2014-11-25 23:20:41", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "HP", nickname: nil, vendor: "Unknown", os: "HP printer: LaserJet CM1312, Photosmart C510a, or ...", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 14, location_id: 14, mac_address: "E8:8D:28:57:AE:22", ip_address: "10.10.10.144", hostname: "time-capsule", created_at: "2014-11-25 23:20:42", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Apple", nickname: nil, vendor: "Unknown", os: "Apple AirPort Extreme WAP or Time Capsule NAS devi...", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 75, location_id: 14, mac_address: "00:14:BF:E0:A0:05", ip_address: "10.10.10.2", hostname: "Hostname Unknown", created_at: "2016-02-18 22:48:01", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Linux", nickname: "test", vendor: "Cisco-Linksys", os: "DD-WRT v23 - v24-sp2 (Linux 2.4.20 - 2.4.37)", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 4, location_id: 14, mac_address: "DC:9F:DB:E6:CF:C1", ip_address: "10.10.10.104", hostname: "main", created_at: "2014-11-25 23:20:41", updated_at: "2016-05-03 18:30:36", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Ubiquiti Networks", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 28, location_id: 14, mac_address: "18:B4:30:15:BB:76", ip_address: "10.10.10.105", hostname: "02AA01AC451400G4", created_at: "2015-02-26 02:24:32", updated_at: "2016-05-03 18:30:36", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Nest Labs", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 8, location_id: 14, mac_address: "B8:78:2E:05:E7:F0", ip_address: "10.10.10.118", hostname: "Apple-TV-3", created_at: "2014-11-25 23:20:41", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Apple", nickname: nil, vendor: "Unknown", os: "Apple iOS 4.4.2 - 5.0.1 (Darwin 11.0.0)", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 24, location_id: 14, mac_address: "74:31:70:0B:56:75", ip_address: "10.10.10.113", hostname: "Hostname Unknown", created_at: "2015-01-29 19:05:44", updated_at: "2016-04-24 14:20:44", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Arcadyan Technology", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 82, location_id: 14, mac_address: "d2:2a:aa:3e:1e:5a:2d", ip_address: "10.10.10.222", hostname: "Hostname Unknown", created_at: "2016-04-18 17:45:30", updated_at: "2016-04-24 14:20:44", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Unknown", os: "Unknown", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 81, location_id: 14, mac_address: "10:9d:07:1b:e4:a7:a8", ip_address: "10.10.10.199", hostname: "Hostname Unknown", created_at: "2016-04-18 16:21:07", updated_at: "2016-04-28 20:49:47", deleted_at: nil, os_vendor: "Linux", nickname: "", vendor: "Unknown", os: "Linux 2.6.32 - 2.6.38", ignore_date: nil, ignore_flag: false>, 
 
#<NetworkHost id: 1, location_id: 14, mac_address: "4C:E6:76:3F:2F:77", ip_address: "10.10.10.1", hostname: "DD-WRT", created_at: "2014-11-25 23:20:41", updated_at: "2016-05-02 13:25:07", deleted_at: nil, os_vendor: "Linux", nickname: "Router", vendor: "Buffalo", os: "DD-WRT v24-sp2 (Linux 2.6.24)", ignore_date: "2016-05-30 00:56:45", ignore_flag: false>, 
 
#<NetworkHost id: 41, location_id: 14, mac_address: "54:9F:13:2A:29:16", ip_address: "10.10.10.133", hostname: "TravisFrsiPhone", created_at: "2015-03-05 18:00:18", updated_at: "2016-04-22 16:11:33", deleted_at: nil, os_vendor: "Unknown", nickname: nil, vendor: "Unknown", os: "Unknown", ignore_date: nil, ignore_flag: false>]

答えて

4

ActiveRecord::Relationの場合、データベースを使用してグループ化してカウントすることができます。

network_hosts.group(:os_vendor).count 

# returns a hash 
{ "linux" => 5, "unkown" => 35, "mac" => 10, etc... } 

アレイ場合は

network_hosts 
    .group(:os_vendor) 
    .count 
    .map { |os_vendor, count| { "label" => os_vendor, "value" => count } } 

# returns an array of hashes 
[ { "label" => "linux", "value" => 5 } ... ] 

を望む形にデータを変換するために、結果の上にmapあなたがリンクされたライブラリは、2つのキー、labelvalueを持つ配列を望んでいるようなので、あなたができるようです単純なRubyの配列です。データベースの代わりにRubyを使用してグループ化する必要があります

network_hosts 
    .group_by(&:os_vendor) 
    .map { |os_vendor, group| { "label" => os_vendor, "value" => group.size } } 
+0

私が見る唯一の問題は、Morris.jsがあなたのコードで作成されたハッシュは '{:label =>" Apple "、:value => 2}"ですが、 '{label:" Download Sales "、value:12}のようになります。私はこれが今私のチャートが表示されていない理由だと思う。 – Godzilla74

+0

あなたのビューでは、最後に 'to_json'の呼び出しを追加します。 '<%= raw grouped_network_hosts.to_json%>' – patkoperwas

3
私のようなものだろう

:戻ってくる

type_count = network_hosts.reduce(Hash.new(0)) do |hash, host| 
    hash.update(host. os_vendor => hash[host. os_vendor].next) 
end 
data = type_count.map { |k, v| { label: k, value: v } } 

[ 
    { 
    :label => "Unknown", 
    :value => 10 
    }, 
    { 
    :label => "Linux", 
    :value => 4 
    }, 
    { 
    :label => "Linksys", 
    :value => 1 
    }, 
    { 
    :label => "HP", 
    :value => 1 
    }, 
    { 
    :label => "Apple", 
    :value => 2 
    } 
] 
+0

上記のコメントと同じ問題です。私は出力が間違ってフォーマットされていると思う – Godzilla74

+0

patkoperwasがすでに答えているように:私のコード例は、Rubyの一部をカバーしています。 'data'をJSONとしてビューに含める必要がある場合は、次のようなものが必要になります:' data:<%== data.to_json%> ' – spickermann

関連する問題