Как обойти стратегическую загрузку в Datamapper? - PullRequest
0 голосов
/ 09 марта 2012

Я обрабатываю тонну книжных записей (12,5 миллионов) с помощью Ruby и Datamapper. В редких случаях мне нужно получить связанные идентификаторы для конкретной записи книги, но Datamapper создает оператор выбора, собирающий все связанные идентификаторы для всех записей книги. Запрос занимает более 2 минут.

http://datamapper.org/why.html

В справочном документе говорится, что это «Стратегическая энергичная загрузка» и ...

"Идея состоит в том, что вы не собираетесь загружать набор объектов и использовать только ассоциацию только для одного из них. Это должно довольно хорошо противостоять правилу 99%.

Если вы не хотите, чтобы это работало так, просто загрузите нужный элемент в его собственном наборе. Так что DataMapper думает о будущем. Нам нравится называть это «исполнителем по умолчанию». Эта функция в одиночку удаляет «проблему запроса N + 1». "

Однако, как вы загружаете предмет в его собственном наборе? Кажется, я не могу найти способ указать, что я действительно хочу запрашивать идентификаторы только для одной из записей книги.

1 Ответ

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

Если у вас возникла эта проблема, возможно, это связано с тем, что вы используете Model.first (), а не Model.get (). Смотрите мои комментарии под вопросом тоже.

Начиная с DM 1.1.0 ...

Пример использования Model.first:

# this will create a select statement for one book record
book = Books.first(:author => 'Jane Austen')

# this will create select statement for all isbns associated with all books
# if there are a lot of books and identifiers, it will take forever
book.isbns.each do |isbn|
  # however, as expected it only iterates through related isbns
  puts isbn
end

Это то же поведение, что и при использовании Book.all, а затем при выборе ассоциации на одном

Пример использования Model.get:

# this will create a select statement for one book record
book = Books.get(2345)

# this will create select statement for book with a primary key of 2345
book.isbns.each do |isbn|
  puts isbn
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...