ruby 数据映射器、负载和对象以及关联对象
ruby data mapper, load and object and associated objects
如何加载一个对象和所有关联的对象?我问是因为延迟加载(我认为是延迟加载)给我带来了问题。
虽然这是一件很慢的事情,但没关系,因为这个脚本每 10 分钟只会 运行 一次。
是否有类似的东西:
Model_Object.all(load_all_now: true)
不幸的是,没有一个好的方法来做到这一点。最简单的解决方案是实际查询单个记录,这当然比使用类似以下方式一次加载所有属性更慢:
objects = ModelObject.all.map { |o| ModelObject.get(o.id) }
稍微复杂一些,您可以使用如下方法重载 DataMapper::Resource
:
def from_sql(sql, *bind_values)
self.repository.adapter.select(sql, *bind_values).map(&:as_json).map do |h|
if h.is_a?(Hash)
self.new(h)
else
self.new(id: h)
end.tap do |record|
record.persistence_state = DataMapper::Resource::PersistenceState::Clean.new(record)
end
end
end
然后传入这样的东西:
properties = ModelObject.properties.map(&:field)
objects = ModelObject.from_sql("SELECT #{properties.join(", ")} FROM table_name")
如何加载一个对象和所有关联的对象?我问是因为延迟加载(我认为是延迟加载)给我带来了问题。 虽然这是一件很慢的事情,但没关系,因为这个脚本每 10 分钟只会 运行 一次。
是否有类似的东西:
Model_Object.all(load_all_now: true)
不幸的是,没有一个好的方法来做到这一点。最简单的解决方案是实际查询单个记录,这当然比使用类似以下方式一次加载所有属性更慢:
objects = ModelObject.all.map { |o| ModelObject.get(o.id) }
稍微复杂一些,您可以使用如下方法重载 DataMapper::Resource
:
def from_sql(sql, *bind_values)
self.repository.adapter.select(sql, *bind_values).map(&:as_json).map do |h|
if h.is_a?(Hash)
self.new(h)
else
self.new(id: h)
end.tap do |record|
record.persistence_state = DataMapper::Resource::PersistenceState::Clean.new(record)
end
end
end
然后传入这样的东西:
properties = ModelObject.properties.map(&:field)
objects = ModelObject.from_sql("SELECT #{properties.join(", ")} FROM table_name")