12

アプリケーションを Rails 3 にアップグレード中です。mysql2 gem を使用することにしました。アプリには、次のような呼び出しを行うレガシー コードがいくつかあります。

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

2.3.x バージョンでは、

results.each_hash do |row|
...

しかし、gem mysql2 では、結果は typeであり、メソッドMysql2::Resultしかありません。eachドキュメントを確認したところ、結果はフィールド名をキーにしたハッシュにする必要があると指定されています。すごい!

しかし、実際にはArrayではなくHashです。

Rails コンソールを使用して独自のインスタンスを作成Mysql2::Clientし、そこでクエリを実行すると、結果はHashなります。これは私が望むものです。

ActiveRecord::Base.connectionRails アプリケーションでは、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

ダンの答えを改善すると、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 に答える