1

我正在尝试在用户模型上实现geochart,但我的辅助方法上的 sql 查询出现问题。用户模型将国家作为字段之一。

我的问题是将数据分组并传递给 js

用户.js

google.load('visualization', '1', {'packages': ['geochart']});
google.setOnLoadCallback(drawRegionsMap);

function drawRegionsMap() {
//    var data = google.visualization.arrayToDataTable([
//        ['Country', 'Popularity'],
//        ['Germany', 200],
//        ['United States', 300],
//        ['Brazil', 400],
//        ['Canada', 500],
//        ['France', 600],
//        ['RU', 700]
//    ]);

    var data = google.visualization.arrayToDataTable(['users_country_data']);

    var options = {};

    var chart = new google.visualization.GeoChart(document.getElementById('chart_div'));
    chart.draw(data, options);
};

index.html.rb

<%= content_tag :div, "", id: "chart_div", style: "width: 400px; height:200px;",  data: {users: users_country_data} %>

用户.helpers.rb

  def users_country_data
      {
         Country: @users.group("country"),
         Popularity:  @users.count(:group => "country")
      }

  end

编辑。

在此处输入图像描述

4

1 回答 1

0

很抱歉你花了整整一天的时间,rails 和 ruby​​ 应该比这更容易。

def users_country_data
  countries = @users.select('distinct country').map(&:country)
  countries.collect { |country| [country, @users.where(country: country).count] }.to_s
end

这将为您提供 js 的数组,例如:

[["Argentina", 100], ["USA", 200]]

如果您还想添加标题:

def users_country_data
  countries = @users.select('distinct country').map(&:country)
  countries.collect { |country| [country, @users.where(country: country).count] }.unshift(['Country', 'Popularity']).to_s
end

您得到错误数量的参数(1 代表 0),因为 @users 是用户数组,@users 是用户数组而不是 ActiveRecord 关系的任何原因?

编辑:我使用 = 而不是 == 进行比较

def users_country_data
  countries = @users.map(&:country).uniq
  countries.collect { |country| [country, @users.collect {|u| u.country == country}.count] }.to_s
end

聊天后,请记住您想要所有用户的图表:

def users_country_data
  countries = User.select('distinct country').map(&:country)
  countries.collect { |country| [country, User.where(country: country).count] }.unshift(['Country', 'Popularity']).to_s
end
于 2013-03-31T09:58:35.940 回答