在Rails中创建哈希

时间:2015-12-23 19:16:07

标签: javascript ruby-on-rails arrays ruby hash

在我的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
....

我想知道是否有可能在控制器中动态创建变量,如下面的伪代码,如果是,如何?

  • 阅读所有独特的Balance.account_id
  • 表示每个Balance.account_id
    • 返回帐户名称(Account.name)
    • 与Balance.account_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排序的所有余额。

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)]]
      }
    ]

2 个答案:

答案 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方法来自定义余额集合的结构,这些方法返回具有您需要的值的哈希值。