【问题标题】:How To Read Database Result in Ruby On Rails如何在 Ruby On Rails 中读取数据库结果
【发布时间】:2018-05-18 21:13:14
【问题描述】:

我在 RoR 操作中将原始 SQL 发送到 MySQL 表:

sql1 = "SELECT COUNT(*) as cnt FROM testtabl WHERE gender= 'female' AND 
ROUND(height, 2) = ROUND('#{height}' , 2);"

sql_result1 = ActiveRecord::Base.connection.execute(sql1)

logger.debug('count is: '+sql_result1.to_s)

如何从 sql_result1 访问值 'cnt'?

日志显示:

count is: #<Mysql2::Result:0xb73c6c0>

【问题讨论】:

  • 如果你已经在使用activerecord,为什么还需要使用raw sql?
  • 编辑您的帖子并添加p sql_result1的输出。
  • 尝试sql_result1.to_h 可能会得到一个哈希...
  • 你可以使用Model.where(gender: 'female').where('round(height, 2) = round(?, 2)', height).count,不是吗?
  • 哦,另外,您正在比较浮点数的精确相等性。 round(.., 2) not 的意思是“神奇地创建一个始终与相似数字匹配的数字”。浮点精度仍然可以创建应该相同但无法通过相等性测试的数字。

标签: ruby-on-rails


【解决方案1】:

OP 的问题的答案是 MySQL::Result 的行为类似于枚举,因此您可以将其转换为行数组,然后索引第一行的值:

sql_result1.to_a[0][0]

然而,OP 问题的答案是让 ActiveRecord 做它的事情:

Model.where(gender: 'female').where('ROUND(height, 2) = ROUND(?, 2)', height).count

新问题是这会比较浮点数是否相等 - 尽管有 ROUND(.., 2)。解决方法是比较一个小范围:

Model.where(gender: 'female').where('ROUND(?, 2) BETWEEN ROUND(height, 2) - 0.0000001 AND ROUND(height, 2) + 0.0000001', height).count

可能有一种冗余较少的数据库方法来按范围比较浮点数...

【讨论】:

    【解决方案2】:

    所以基本上你想使用原始 sql 并将结果放入哈希中以便可以访问。试试下面的代码,其中 MODEL 是模型的类名。像 users 表的类名可以是 User。

    Model.connection.select_all(sql).to_hash
    

    但是,您可以使用带有内置循环方法的 ActiveRecord where 子句。

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2013-03-02
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多