【问题标题】:ruby data mapper, load and object and associated objectsruby 数据映射器,加载和对象以及关联对象
【发布时间】:2017-07-20 17:10:46
【问题描述】:

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

有没有类似的东西:

Model_Object.all(load_all_now: true)

【问题讨论】:

    标签: ruby ruby-datamapper


    【解决方案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")
    

    【讨论】:

    • 为什么没有办法强制加载所有对象?
    • 希望我能给你一个答案。 DataMapper 是一个多年未真正维护的旧项目。 ActiveRecord 更加先进且对开发人员友好,但我们中的一些人仍然必须使用 DM。我在回答中给你的方法已添加到我正在处理的应用程序中,以解决 DM 的一些缺点,但总是有更多。
    • 我明白了,谢谢,下次我只需要整合活动记录。
    • 澄清一下,objects包含ModelObject的所有实例+关联的objects?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2012-03-17
    • 2020-06-26
    相关资源
    最近更新 更多