Как получить доступ к полям по имени атрибута из результатов строки ActiveRecord? - PullRequest
0 голосов
/ 09 января 2012

Очевидно, я упускаю что-то очевидное здесь, но был бы признателен за быстрый пример.

Я получил запись, возвращаемую из ActiveRecord, где у меня есть несколько столбцов, выбранных из запроса.Поля имеют формат BigDecimal и должны быть сведены к строке.

Сначала я думал, что достаточно получить запрос с помощью:

rows = ModelName.order("date DESC").select('table_name.precise_number1, table_name.precise_number2').limit(100).all.zip
rows_stringified1 = Array.new
rows_stringified2 = Array.new

readings.each do |row|
  rows_stringified1.push row[:precise_number1].to_s
  rows_stringified2.push row[:precise_number2].to_s
end

Однако это приводит к ошибке, такой какcan't convert Symbol into Integer.Очевидно, я не следую в точности, как получить доступ к столбцам из записей в результате набора строк.

Как вы обычно это делаете?

1 Ответ

2 голосов
/ 09 января 2012

Предположительно у вас есть опечатка, и вы делаете это:

readings = ModelName.order("date DESC").
                     select('table_name.precise_number1, table_name.precise_number2').
                     limit(100).
                     all.
                     zip

вместо присвоения rows. Заметили, что zip в конце? Это не имеет никакого смысла. Когда вы делаете это:

[a, b, c].zip

Вы получите это:

[[a], [b], [c]]

Итак, в вашем readings.each блоке row на самом деле [model], а не model, который, как вы думаете, есть, и это означает, что row[:precise_number1] пытается получить доступ к Array row с использованием символа :precise_number1 вместо целочисленного значения, ожидаемого массивом, следовательно, ваша ошибка "не удается преобразовать символ в целое число".

Так что либо избавьтесь от zip и оставьте свой each как есть:

readings = ModelName.order("date DESC").
                     select('table_name.precise_number1, table_name.precise_number2').
                     limit(100).
                     all
# ...
readings.each do |row|
  rows_stringified1.push row[:precise_number1].to_s
  rows_stringified2.push row[:precise_number2].to_s
end

или оставьте zip и настройте блок each так, чтобы row действительно выглядело так:

readings = ModelName.order("date DESC").
                     select('table_name.precise_number1, table_name.precise_number2').
                     limit(100).
                     all.
                     zip
# ...
readings.each do |row|
  rows_stringified1.push row.first[:precise_number1].to_s
  rows_stringified2.push row.first[:precise_number2].to_s
end

Я бы порекомендовал избавиться от zip, так как он ничего не дает и просто сбивает с толку.

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