Стратегическая нетерпеливая загрузка для отношений «многие ко многим» в Datamapper? - PullRequest
7 голосов
/ 26 августа 2009

Я использую DataMapper , ORM с открытым исходным кодом для ruby, и у меня зуд, который я хотел бы поцарапать. В настоящее время DataMapper может использовать стратегическую загрузку (SEL) для отношений один-ко-многим, но не ко многим-многим, где происходит N + 1 запросов. Я хотел бы поработать над тем, чтобы сделать эту работу правильно, но я не могу найти, где это сделать. Итак, вопрос из двух частей:

  1. Как запустить набор тестов, чтобы он показал, что это не удается (хотя сейчас все спецификации, которые должны быть неисправны, помечены как ожидающие)?
  2. Где и как реализован SEL для отношений один ко многим?

1 Ответ

0 голосов
/ 06 марта 2012

По второму вопросу вы можете попробовать погрузиться в код:

/ Lib / дм-ядро / ассоциации / relationship.rb

  # Eager load the collection using the source as a base
  #
  # @param [Collection] source
  #   the source collection to query with
  # @param [Query, Hash] query
  #   optional query to restrict the collection
  #
  # @return [Collection]
  #   the loaded collection for the source
  #
  # @api private
  def eager_load(source, query = nil)
    targets = source.model.all(query_for(source, query))

    # FIXME: cannot associate targets to m:m collection yet
    if source.loaded? && !source.kind_of?(ManyToMany::Collection)
      associate_targets(source, targets)
    end

    targets
  end

. / Lib / dm-core / association / one_to_many.rb:

    def lazy_load(source)
      return if loaded?(source)

      # SEL: load all related resources in the source collection
      if source.saved? && (collection = source.collection).size > 1
        eager_load(collection)
      end

      unless loaded?(source)
        set!(source, collection_for(source))
      end
    end
...