Почему Rails 3 с Mysql2 Gem ActiveRecord :: Base.connection.execute (sql) возвращает массив, а не хэш? - PullRequest
12 голосов
/ 23 апреля 2011

Я нахожусь в процессе обновления приложения до Rails 3. Я решил использовать гем 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 и запускаю запрос там,результаты равны a Hash, что мне и нужно.

В приложении rails я думаю, что лучше использовать ActiveRecord::Base.connection, так как оно было создано с опциями из базы данных.YML.

Обратите внимание, к сожалению, результат не сопоставляется с моделью, поэтому я не могу его использовать.

То, что я сейчас сделал, например:

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

Что безобразно, как грех.

Кто-нибудь знает, как заставить его вернуть хэш вместо массива?

Ответы [ 5 ]

44 голосов
/ 28 мая 2011

Я столкнулся с подобной проблемой некоторое время назад и обнаружил, что это работает:

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

edit: вы также можете использовать метод select_all объекта соединения, который возвращает хеш

26 голосов
/ 06 июня 2012

вместо

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

6 голосов
/ 24 апреля 2011

Если вы просто хотите повторно использовать конфигурацию 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
2 голосов
/ 26 мая 2012
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
0 голосов
/ 01 января 2013

Улучшая ответ Дана, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...