将 PG::Result 转换为 Active Record 模型
Convert PG::Result to an Active Record model
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
.
实例化的
它看起来像一个 hack,但无论如何
fields = result.fields
models = result.values.map { |value_set|
hash = Hash[fields.zip(value_set)]
model = Model.new(hash)
# some attributes may not be assigned i.e. id, created_at and updated_at
# in that case you can assign them manually:
# model.id = hash["id"]
model.instance_variable_set :@new_record, false
model
}
我想你想要的是ActiveRecord::Base.instantiate
方法。它将正确处理 new_record?
/persisted?
问题,并为单 table 继承找到正确的 class。
例如:
fields = result.fields
models = result.values.map { |value_set|
Model.instantiate(Hash[fields.zip(value_set)])
}
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
.
它看起来像一个 hack,但无论如何
fields = result.fields
models = result.values.map { |value_set|
hash = Hash[fields.zip(value_set)]
model = Model.new(hash)
# some attributes may not be assigned i.e. id, created_at and updated_at
# in that case you can assign them manually:
# model.id = hash["id"]
model.instance_variable_set :@new_record, false
model
}
我想你想要的是ActiveRecord::Base.instantiate
方法。它将正确处理 new_record?
/persisted?
问题,并为单 table 继承找到正确的 class。
例如:
fields = result.fields
models = result.values.map { |value_set|
Model.instantiate(Hash[fields.zip(value_set)])
}