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

时间:2017-07-20 17:10:47

标签: ruby ruby-datamapper

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

有类似的东西:

Model_Object.all(load_all_now: true)

1 个答案:

答案 0 :(得分:1)

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

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