为什么Rails 3与Mysql2 Gem ActiveRecord :: Base.connection.execute(sql)返回数组而不是哈希?

时间:2011-04-22 21:11:23

标签: ruby-on-rails-3 gem mysql2

我正在将应用程序升级到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

这是罪恶的丑陋。

有没有人可以如何让它返回Hash而不是Array?

5 个答案:

答案 0 :(得分:44)

我前段时间遇到了类似的问题,发现这个问题有效:

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

编辑:您还可以使用返回哈希

的连接对象的select_all method

答案 1 :(得分:26)

而不是

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

DO

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

那就完全按照你的意愿行事。特别是,

results.first

将是哈希,依此类推。

感谢@_fx解决这个问题!

有关详情,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html#method-i-exec_query

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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|
        # user should be a hash
    end