12

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

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

在 2.3.x 版本中,它使用

results.each_hash do |row|
...

但是对于 gem mysql2, results 是 type Mysql2::Result,它只有一个each方法。检查了文档,他们指定结果应该是字段名称上的哈希键。伟大的!

但实际上,它是一个Array,而不是一个Hash

当我使用 rails 控制台并实例化自己的控制台并Mysql2::Client在那里运行查询时,结果a 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

这是丑陋的罪恶。

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

4

5 回答 5

46

不久前我遇到了类似的问题,发现这可行:

result = ActiveRecord::Base.connection.execute(sql) 
result.each(:as => :hash) do |row| 
   row["field"] 
end

编辑:您还可以使用返回哈希的连接对象的select_all 方法

于 2011-05-27T20:25:50.430 回答
26

代替

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

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

这将完全符合您的要求。尤其,

results.first

将是一个哈希,依此类推。

感谢@_fx 解决了这个问题!

有关更多信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html#method-i-exec_query

于 2012-06-06T14:21:29.900 回答
6

如果您只想重用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
于 2011-04-24T03:54:19.107 回答
2
results = ActiveRecord::Base.connection.select(sql) 

表头

results.first.keys.each do |key|
 key
end

表数据

results.each do |result| %>
  result.values.each do |value| %>
    value
  end
end
于 2012-05-26T10:27:50.913 回答
0

改进 dan 的答案,Rails 3.2.8 将不接受 RAILS_ENV。

    config = ActiveRecord::Base.configurations[Rails.env].symbolize_keys
    conn = Mysql2::Client.new(config)
    conn.query("select * from users").each do |user|
        # 用户应该是一个哈希
    结尾

于 2013-01-01T12:23:03.440 回答