Ruby:向数组中的每个数组添加一个新元素,这样新元素就是现有元素的下层版本

时间:2015-08-19 15:45:08

标签: arrays ruby

如果

@users = User.all.group_by(&:iso).map{|k,v| [k, v.count]}

返回

 [["GB", 1], ["GI", 3], ["BD", 1]]

为什么我不能这样做

 @users = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.downcase]}

获取

[["GB", 1, "gb"], ["GI", 3, "gi"], ["BD", 1, "bd"]]

我收到错误

      undefined method `downcase' for nil:NilClass

我如何得到这个。

如果我这样做

   @user_json = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.inspect]}

我得到了

   [["GB", 1, "\"GB\""], ["GI", 3, "\"GI\""], ["BD", 1, "\"BD\""]

然后

  @user_json = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.inspect.downcase]}

 [["GB", 1, "\"gb\""], ["GI", 3, "\"gi\""], ["BD", 1, "\"bd\""]

诉混淆

更多细节 - 这项工作(但如果错了,无法解释原因)

我正在尝试使用以下结构构建JSON数组:

   [{"code":"GB","value":1,"flag":"gb"},{"code":"GI","value":3,"flag":"gi"},{"code":"BD","value":1,"flag":"bd"}]

我的控制器代码

     def global_chart
          @user_json = User.all.group_by(&:iso).map{|k,v| [k, v.count, k.to_s.downcase]}.map {|c, v | ["code" => c, "value" => v, "flag" => c.to_s.downcase]}.flatten.to_json
          render 'users/charts/global'
    end

这有效(@user_json变量具有正确的结构)但是我不能解释上面的行为......

1 个答案:

答案 0 :(得分:1)

您的代码

@users = User.all.group_by(&:iso).map{ |k,v| [k, v.count] }

绝对有效,其输出显示我们只有三个iso组。然后

@users = User.all.group_by(&:iso).map{ |k,v| [k, v.count, k.downcase] }

也是绝对有效的代码。但是你得到一个错误undefined method 'downcase' for nil:NilClass,它告诉我们一个iso值是nil。第一个示例输出中的情况并非如此。

之后,你的第三个片段

User.all.group_by(&:iso).map{ |k,v| [k, v.count, k.inspect.downcase] }

再次正确,返回与第一个相同的输出(我的意思是相同的iso样本)。

因此代码中的某处是bug。我相信它接近于提供一段代码。您可以显示整个控制器的代码,以查看表面上可能存在的问题。