为什么Rails 3与Mysql2 Gem ActiveRecord::Base.connection.execute(sql)返回Array而不是Hash?[英] Why does Rails 3 with Mysql2 Gem ActiveRecord::Base.connection.execute(sql) return Array not Hash?

本文是小编为大家收集整理的关于为什么Rails 3与Mysql2 Gem ActiveRecord::Base.connection.execute(sql)返回Array而不是Hash?的处理方法,想解了为什么Rails 3与Mysql2 Gem ActiveRecord::Base.connection.execute(sql)返回Array而不是Hash?的问题怎么解决?为什么Rails 3与Mysql2 Gem ActiveRecord::Base.connection.execute(sql)返回Array而不是Hash?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在将应用程序升级到 Rails 3.我决定使用 mysql2 gem.应用程序中有一些遗留代码可以进行如下调用:

results = ActiveRecord::Base.connection.execute(sql)

在2.3.x版本中使用

results.each_hash do |row|
...

但是使用 gem mysql2,结果是类型 Mysql2::Result,它只有一个 each 方法.检查了文档,他们指定结果应该是字段名称上的哈希键.太好了!

但其实它是一个Array,而不是一个Hash.

当我使用 rails 控制台并实例化我自己的 Mysql2::Client 并在那里运行查询时,结果 是一个 Hash,这正是我想要的.

在rails 应用程序中,我认为最好使用ActiveRecord::Base.connection,因为它是使用database.yml 中的选项实例化的.

注意,很遗憾,结果没有映射到模型,所以我不能使用它.

我现在所做的是,例如:

result = ActiveRecord::Base.connection.execute(sql)
field_index = result.fields.index("field")
result.each do |row|
  row[field_index]
end

这是丑陋的罪恶.

有没有人可以让它返回一个哈希而不是数组?

解决方案

如果你只是想复用database.yml的配置,可以这样:

config = ActiveRecord::Base.configurations[RAILS_ENV].symbolize_keys
conn = Mysql2::Client.new(config)
conn.query("select * from users").each do |user|
  # user should be a hash
end

本文地址:https://www.itbaoku.cn/post/786412.html