概要
rails で生 SQL を発行した場合は各フィールドをキーにした hash が返ってきます。そのため、各フィールドにアクセスするためには r['id'] のようにアクセスする事になります。
ActiveRecord のメソッド (r = Foo.first 等) を使用した場合は r.id とアクセスできます。
同じプロジェクト内のソースでアクセス方法に違いがあると、混乱するかもしれません。生 SQL を発行した場合でも ActiveRecord のメソッドと同じ方法でアクセスできるようにしておいた方が良いと思いました。
方法
Struct を使用します。
実例
class RawSelect
def self.execute_select
sql = 'SELECT id, name, age FROM emp'
ActiveRecord::Base.connection.select_all(sql).map do |r|
EmpInfo.new(
r['id'],
r['name'],
r['age']
)
end
end
private
EmpInfo = Struct.new(
:id,
:name,
:age
)
end
RawSelect.execute_select.each do |r|
p r.id
p r.name
p r.age
end
参考
OpenStruct を使用すれば、手軽に同じ事が実現できますが、 3.0 から非推奨です。