Javascript 在Rails中创建哈希
在我的Rails应用程序中,我尝试使用Chart.js创建一个线图,其中数据集基于从控制器传递的数据(在gon gem的帮助下)。具体来说,我希望每个数据集都基于一个帐户id 当前,控制器包含此代码,其中gon.balances是具有以下字段的对象数组-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 ....
帐户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
{: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是一个具有相同名称的活动记录对象数组。