在我的Rails应用程序中,我正在尝试使用Chart.js根据从控制器传递的数据(借助gon gem)创建包含数据集的折线图。具体来说,我希望每个数据集都基于account_id。
目前,控制器包含此代码,其中gon.balances是具有以下字段的对象数组 - account_id, balance, date
...:
balances_controller.rb:
....
def index
@balances = Balance.all.order(date: :desc)
gon.balances = @balances
end
....
我想知道是否有可能在控制器中动态创建变量,如下面的伪代码,如果是,如何?
所以在影响中,我希望能够返回像这样的对象数组:
{:balance1.account.name => [[balance1.date, balance1.balance],
[balance2.date, balance2.balance]],
:balance3.account.name => [[balance3.date, balance3.balance]] }
更新
在Dileep Nandanam的帮助下,我已经设法返回按帐户ID排序的所有余额。
balances_controller.rb:
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)]]
}
]
答案 0 :(得分:1)
您可以使用account_id对对象进行分组,以使用acc_ids作为键和余额数组作为值来制作哈希值。
@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)
答案 1 :(得分:0)
您需要将rails中的数据注入到某个地方的javascript中。在您的示例中,您可以通过在打开var gon = gon || {}; gon.balances = <%= @balances.to_json %>
后立即添加类似于以下内容的内容来修改index.html.erb。
as_json
您可以通过在模型中实现return
方法来自定义余额集合的结构,这些方法返回具有您需要的值的哈希值。