Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Rails中创建哈希_Javascript_Ruby On Rails_Arrays_Ruby_Hash - Fatal编程技术网

Javascript 在Rails中创建哈希

Javascript 在Rails中创建哈希,javascript,ruby-on-rails,arrays,ruby,hash,Javascript,Ruby On Rails,Arrays,Ruby,Hash,在我的Rails应用程序中,我尝试使用Chart.js创建一个线图,其中数据集基于从控制器传递的数据(在gon gem的帮助下)。具体来说,我希望每个数据集都基于一个帐户id 当前,控制器包含此代码,其中gon.balances是具有以下字段的对象数组-帐户id、余额、日期…: 平衡控制器.rb: .... def index @balances = Balance.all.order(date: :desc) gon.balances = @balances end ....

在我的Rails应用程序中,我尝试使用Chart.js创建一个线图,其中数据集基于从控制器传递的数据(在gon gem的帮助下)。具体来说,我希望每个数据集都基于一个帐户id

当前,控制器包含此代码,其中gon.balances是具有以下字段的对象数组-
帐户id、余额、日期
…:

平衡控制器.rb:

....
def index
  @balances = Balance.all.order(date: :desc)

  gon.balances = @balances
end
....
  def index
    @balances = Balance.all.order(date: :desc)

    @balancesSortedByAccountId = Hash[
      Balance.all.order(date: :desc).group_by(&:account_id).map{|acc_id, acc_details|
        ["acc_#{acc_id}".to_sym, acc_details.map(&:balance)]
      }
    ]

    gon.balances = @balances
    gon.balancesSortByAccId = @balancesSortedByAccountId
  end
我想知道是否可以像下面的伪代码那样在控制器中动态创建变量,如果可以,如何创建

  • 读取所有唯一余额。帐户\u id
  • 对于每个余额。帐户\u id
    • 返回帐户名(account.name)
    • 与该Balance.account\u id对应的所有Balance.date和Balance.Balance
因此,在effect中,我希望能够返回如下对象数组:

{:balance1.account.name => [[balance1.date, balance1.balance],
                           [balance2.date, balance2.balance]],
:balance3.account.name  => [[balance3.date, balance3.balance]] }
更新:

在下面Dileep Nandanam的帮助下,我成功地返回了按帐户id排序的所有余额

平衡控制器.rb:

....
def index
  @balances = Balance.all.order(date: :desc)

  gon.balances = @balances
end
....
  def index
    @balances = Balance.all.order(date: :desc)

    @balancesSortedByAccountId = Hash[
      Balance.all.order(date: :desc).group_by(&:account_id).map{|acc_id, acc_details|
        ["acc_#{acc_id}".to_sym, acc_details.map(&:balance)]
      }
    ]

    gon.balances = @balances
    gon.balancesSortByAccId = @balancesSortedByAccountId
  end
它提供如下哈希:

{:acc_id1 => [balance1, balance2], :acc_id2 => [balance_3] }
我如何修改它以提供如下哈希:

{:balance1.account.name => [[balance1.date, balance1.balance],
                           [balance2.date, balance2.balance]],
:balance3.account.name  => [[balance3.date, balance3.balance]] }
我不确定如何返回名称,我尝试了以下方法来创建日期和余额的数组,但这会导致两个单独的数组:

    @balancesSortedByAccountId = Hash[
      Balance.all.order(date: :desc).group_by(&:account_id).map{|acc_id, acc_details|
        ["acc_#{acc_id}".to_sym, [acc_details.map(&:date), acc_details.map(&:balance)]]
      }
    ]

您需要将rails中的数据注入javascript中。在您的示例中,可以在打开
后添加类似于以下行的内容来修改index.html.erb

var gon=gon | |{};gon.余额=

您可以通过在模型中实现
as_json
方法来定制余额集合的结构,这些方法返回一个包含您需要的值的散列。

您可以使用account\u id对对象进行分组,从而生成一个散列,其中acc\u id作为键,余额数组作为值

@balances = Hash[
  Balance.all.order(date: :desc).group_by(&:account_id).map{|acc_id, acc_details|
    ["acc_#{acc_id}".to_sym, acc_details.map(&:balance)]
  }
]
会给你一个像

{:acc_id1 => [balance1, balance2], :acc_id2 => [balance_3] }
您可以通过以下方式将其转换为go变量:

gone.push(@balances)

在我的javascript示例中,数据在gon.balances中可用,但在我的示例中,gon.balances是一个9个对象的数组,其中一些对象具有相同的帐户id。我的问题是尝试对它们进行分组,以便每个帐户id有一个对象。@Bhav与您提出的问题无关,但是看看rails文档中的
groupby
,我的控制器中没有收到任何方法错误1:Fixnum的未定义方法“to_sym”请参见编辑。“acc#{acc#u id}”将帮助您将一个gone变量作为gone进行访问。acc#u 123谢谢。这是有道理的。我更新了OP,因为我想修改散列以返回附加信息,例如每个余额的日期和帐户名,而不是id。您只需使用[acc_details.account.name,acc_details.map(&:attributes)]作为散列的有序对,因此,密钥将是一个包含帐户名称和值的字符串,作为包含帐户详细信息的哈希数组。请尝试acc_details.first.account.name,因为acc_details是一个具有相同名称的活动记录对象数组。