将PG :: Result转换为Active Record模型

fny*_*fny 13 ruby ruby-on-rails rails-activerecord

pg-ruby 允许您一次性向数据库发送多个查询,这有助于最大限度地减少对数据库的访问次数:

results = []
conn.send_query('QUERY1;QUERY2;QUERY3')
conn.block
while result = conn.get_result
  results << result
end
Run Code Online (Sandbox Code Playgroud)

鉴于对于result我已经知道的Active Record模型,将结果转换为模型的适当方法是什么?现在我正在做以下事情:

fields = result.fields
models = result.values.map { |value_set| 
  Model.new(Hash[fields.zip(value_set)])
}
Run Code Online (Sandbox Code Playgroud)

该方法的问题在于,每个Active Record对象看起来都不是#persisted?因为它们已经被实例化了.new.

the*_*ler 11

我想你想要的是ActiveRecord::Base.instantiate方法.它将正确处理new_record?/ persisted?问题,以及为单表继承找到正确的类.

例如:

fields = result.fields
models = result.values.map { |value_set| 
  Model.instantiate(Hash[fields.zip(value_set)])
}
Run Code Online (Sandbox Code Playgroud)