【问题标题】:How to convert activerecord result into a hash?如何将活动记录结果转换为哈希?
【发布时间】:2016-03-07 22:11:17
【问题描述】:

我有一个在 ActiveRecord 中成功返回结果的查询。

select
    trunc(b.transaction_date) as transaction_date,
    sum(a.transaction_amount) as transaction_amount
from
  payment_transaction a,
  payment_settlement b
where
    a.transaction_status = 'S'
    and b.settlement_type = 'D'
    and trunc(b.transaction_date) > sysdate - 30
    and a.payment_transaction_id = b.payment_transaction_id
group by
    trunc(b.transaction_date)
order by
    trunc(b.transaction_date)

以上查询返回 9 个结果。

我想要的是将上面获得的整个结果转换为哈希,例如:

{
"01/01/16" => 764.00, 
"02/01/16" => 1508.00, 
"03/01/16" => 2000.00 
..
..
..
}

我怎样才能做到这一点?

【问题讨论】:

  • 什么是“逗号分隔哈希”?您是指普通的哈希(如foo = {})还是类似于上面的字符串?
  • 只是一个普通的哈希。为混乱道歉。我将更新我上面的问题,以便正确反映所需内容。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这应该可行:

Hash[ActiveRecord::Base.connection.select_rows(sql)]

解释一下:这里不需要实例化 AR 实例,所以只需运行你的 SQL。使用select_rows 将为您提供一个数组数组,其中外部数组的每个元素都是 SQL 结果中的一行。每个内部数组都有两个元素:日期和交易金额。

现在你可以将一个双元素数组的数组传递给Hash[],它会将每个内部数组的第一部分解释为哈希键,将第二部分解释为哈希值。

编辑:我假设您正在设置sql,如下所示:

sql = <<-EOQ
    select
        trunc(b.transaction_date) as transaction_date,
        sum(a.transaction_amount) as transaction_amount
    from
      payment_transaction a,
      payment_settlement b
    where
        a.transaction_status = 'S'
        and b.settlement_type = 'D'
        and trunc(b.transaction_date) > sysdate - 30
        and a.payment_transaction_id = b.payment_transaction_id
    group by
        trunc(b.transaction_date)
    order by
        trunc(b.transaction_date)
EOQ

所以它是一个包含您要运行的 SQL 的字符串。

【讨论】:

  • 感谢您的快速反应,保罗。但是我正在针对我的一个模型PaymentTransaction 启动我的sql,如下所示:@sales_volume_for_last_30_days = PaymentTransaction.find_by_sql(" select ....")。我不确定如何使用上述函数来转换该实例变量中的数据?
  • 如果您想要的只是日期到金额的哈希值,请不要使用PaymentTransaction.find_by_sql。无论如何,您都不会使用 AR 实例。而是使用ActiveRecord::Base.connection.select_rows
  • 请注意,我的回答假设您在上面编写的 SQL 字符串位于 sql 变量中。
  • 好的。所以我尝试了你的建议,我收到了这个错误消息:SQLite3::SQLException: no such table: payment_transaction。它正在尝试连接到 SQLite DB,但我需要连接到 Oracle DB 才能成功执行查询。我在其中一个模型中找到了这段代码:class PaymentRecord &lt; ActiveRecord::Base self.abstract_class = true establish_connection :payments_reporting_oracle end 这有助于解决问题吗?
  • 顺便说一句,Hash[array_of_arrays]array_of_arrays.to_h 会给你相同的结果(当然假设是最新版本的 Ruby)。
【解决方案2】:
resultArray = yourQueryResult.map{|e| [e["transaction_date"], e["transaction_amount"]]}.

theHash = Hash[*resultArray.flatten]

尚未测试:)

【讨论】:

  • 收到以下错误消息:undefined local variable or method transaction_date
猜你喜欢
  • 2013-06-10
  • 2017-12-10
  • 2018-04-28
  • 1970-01-01
  • 2020-07-13
  • 2023-03-05
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多