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

2023-12-20

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

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

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

fields = result.fields
models = result.values.map { |value_set| 
  Model.new(Hash[fields.zip(value_set)])
}

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


我想你想要的是ActiveRecord::Base.instantiate https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L66方法。它将正确处理new_record?/persisted?问题,以及为单表继承找到正确的类。

例如:

fields = result.fields
models = result.values.map { |value_set| 
  Model.instantiate(Hash[fields.zip(value_set)])
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 PG::Result 转换为 Active Record 模型 的相关文章

随机推荐