为什么Rails 3和Mysql2 Gem ActiveRecord::Base.connection.execute(



我正在将一个应用程序升级到Rails3。我决定选择mysql2。应用程序中有一些遗留代码可以进行以下调用:

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

这是丑陋的罪恶。

有人知道我如何让它返回哈希而不是数组吗?

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

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

edit:您还可以使用连接对象的select_all方法,该方法返回散列

而不是

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

如果您只想重用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
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

改进dan的回答,Rails 3.2.8不会接受Rails_ENV。

config=ActiveRecord::Base.configs[Rails.env].symbolize_keysconn=Mysql2::Client.new(config(conn.query("从用户中选择*"(.each do | user|#用户应该是散列终止

相关内容

  • 没有找到相关文章