ruby数据映射器、加载和对象以及相关对象

ruby数据映射器、加载和对象以及相关对象,ruby,ruby-datamapper,Ruby,Ruby Datamapper,如何加载对象和所有关联对象?我这样问是因为延迟加载(我认为这是延迟加载)给我带来了问题。 虽然这是一件很慢的事情,但它很好,因为这个脚本每10分钟只运行一次 是否有类似于: Model_Object.all(load_all_now: true) objects = ModelObject.all.map { |o| ModelObject.get(o.id) } 不幸的是,没有一个好方法可以做到这一点。最简单的解决方案是实际查询单个记录,这当然比使用以下方法一次加载所有属性还要慢: Mod

如何加载对象和所有关联对象?我这样问是因为延迟加载(我认为这是延迟加载)给我带来了问题。 虽然这是一件很慢的事情,但它很好,因为这个脚本每10分钟只运行一次

是否有类似于:

Model_Object.all(load_all_now: true)
objects = ModelObject.all.map { |o| ModelObject.get(o.id) }

不幸的是,没有一个好方法可以做到这一点。最简单的解决方案是实际查询单个记录,这当然比使用以下方法一次加载所有属性还要慢:

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")
然后像这样传递:

  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")

为什么没有办法强制加载所有对象?希望我能给你一个答案。DataMapper是一个多年没有真正维护的老项目。ActiveRecord非常先进,对开发人员非常友好,但我们中的一些人仍然会使用DM。我在回答中给你的方法被添加到我正在开发的应用程序中,以克服DM的一些缺点,但总是有更多缺点。我明白了,谢谢,我想下次我只需要集成active record。为了澄清一下,对象包含ModelObject+关联对象的所有实例?