2015-12-11 4 views
0

Я попытался сделать данные в соответствии с @wifis (на основе MAC_ID) генерируется, но в настоящее время данные идентичны со следующим кодом -Почему показывает одинаковые данные на каждой итерации .each

Контроллер:

class DashboardsController < ApplicationController 
    before_action :authenticate_user! 
    def show 
    @wifis = Wifi.where(user_id: current_user.id) 
    pdaily_number_of_logins_data = [] 
    phourly_total_traffic_data = [] 
    pper_user_monthly_traffic_data = [] 
    @wifis.each do |wifi| 
     daily_number_of_logins_data = Radacct.fetch("SELECT gd_day(acctstarttime, 'UTC') AS date, COUNT(*) AS count FROM radacct WHERE (`calledstationid` = ?) AND (`acctstarttime` >= ?) GROUP BY date", wifi.mac_id, 1.month.ago) 
     pdaily_number_of_logins_data += daily_number_of_logins_data.to_a if daily_number_of_logins_data.to_a 
     @daily_number_of_logins = pdaily_number_of_logins_data.collect{|i| [i[:date],i[:count]]} 
     hourly_total_traffic_data = Radacct.fetch("SELECT gd_hour_of_day(acctstarttime, 'UTC') AS hour_of_day, ROUND(((SUM(acctinputoctets)+SUM(acctoutputoctets))/1049000)) AS totaltraffic FROM radacct WHERE (`calledstationid` = ?) AND (`acctstarttime` >= ?) GROUP BY hour_of_day", wifi.mac_id, 1.day.ago) 
     phourly_total_traffic_data += hourly_total_traffic_data.to_a if hourly_total_traffic_data.to_a 
     @hourly_total_traffic = phourly_total_traffic_data.collect{|i| [i[:hour_of_day],i[:totaltraffic]]} 
     per_user_monthly_traffic_data = Radacct.fetch("SELECT username, ROUND(((SUM(acctinputoctets)+SUM(acctoutputoctets))/1049000)) AS `traffic` FROM `radacct` WHERE (`calledstationid` = ?) AND (`acctstarttime` >= ?) GROUP BY username", wifi.mac_id, 1.month.ago) 
     pper_user_monthly_traffic_data += per_user_monthly_traffic_data.to_a if per_user_monthly_traffic_data.to_a 
     @per_user_monthly_traffic = pper_user_monthly_traffic_data.collect{|i| [i[:username],i[:traffic]]} 
    end 
    end 
end 

и Вид:

% @wifis.each do |wifi| %> 
    <h1><%= wifi.mac_id %></h1> 
    <%= line_chart @daily_number_of_logins, { discrete: true, library: {hAxis: {title: "Date"}, vAxis: {title: "Number of Logins (daily)"}}} %> 
    <%= column_chart @hourly_total_traffic, {library: {hAxis: {title: "Hour"}, vAxis: {title: "Traffic in Megabytes (hourly)"}}} %> 
    <%= pie_chart @per_user_monthly_traffic, discrete: true %> 
<% end %> 

я попробовал выше на основе этого ответа, но проблема, что я имею @wifi объект используется как в контроллере и просмотров: Loop within Loop in Rails Controller

+0

Это ... даже не .. N + 1 .. –

ответ

0

Проблема заключается в том, что цикл в действии вашего контроллера запускается и перезаписывает переменные экземпляра на каждой итерации. Таким образом, остается только последняя итерация. Если вы хотите сохранить данные для каждого Wi-Fi, вам нужна другая структура данных, а не простые ивары. Возможно, хэш, где Wi-Fi является ключом.

@counters = {} 
@wifis.each do |wifi| 
    @counters[wifi] ||= {} 
    @counters[wifi][:daily_number_of_logins] = ... 

Тогда в представлении

<% @wifis.each do |wifi| %> 
    <%= line_chart @counters[wifi][:daily_number_of_logins] %> 
    <% end %> 
+0

Так @counters [WiFi] || = {} означает, что если [WiFi] существует или создать пустой хэш? Я считаю, @counters [wifi] - часть wifi имеет какое-то отношение к ней, но я не могу понять почему. Проблема решена, и теперь у меня есть два разных результата. – muhammadn

+0

@muhammadn: эта строка запустит пустую надпись, да. Вам, вероятно, не нужно условие. Старая привычка :) –

Смежные вопросы