Как создать ленивое загруженное свойство в Ruby для модели? - PullRequest
9 голосов
/ 07 марта 2011

Я хочу создать свойство с отложенной загрузкой, которое возвращает коллекцию в модели, как мне это сделать?

Я не хочу создавать ассоциацию для этого.

Поэтому я хочу, чтобы он возвращал коллекцию, если коллекция еще не была инициализирована, а затем попала в базу данных, вернула строки, а затем инициализировала ее.

Если он запускается один раз, то нет необходимости запускать его сноватак как запрос на следующей странице начнется снова.

Ответы [ 2 ]

20 голосов
/ 07 марта 2011

Добавьте атрибут экземпляра (например, @my_attribute)

И затем определите

def my_attribute
  @my_attribute ||= initialize_my_attribute
end

(Примечание: initialize_my_attribute - это реализованная вами функция / метод, которая будет загружатьнужное вам значение.)

Как это работает: атрибут начинается со значения nil (мы ничего ему не присвоили).Экземпляр объекта не может получить к нему доступ напрямую, потому что мы не определили атрибут доступа к нему.Вместо этого у нас есть метод, имя которого совпадает с именем атрибута, поэтому при вызове my_object.my_attribute он выглядит точно так же, как если бы вы обращались к атрибуту, когда фактически вызываете метод экземпляра объекта.

Что происходит в методе?Короткая стрелка ||= эквивалентна

@my_attribute = (@my_attribute || initialize_my_attribute)

Так что, если @my_attribute уже имеет значение, это значение возвращается.В противном случае @my_attribute получает присвоенное значение (а затем возвращается).Другими словами: значение будет загружено в @my_attribute при первом обращении к нему (и только в первый раз).

И вуаля!Ленивая загрузка.

0 голосов
/ 23 апреля 2014

Связанные свойства загружаются по умолчанию. Проверьте свои журналы и убедитесь, что запросы к базе данных выполняются только при обращении к свойству.

Я тоже столкнулся с этой проблемой. И после того, как я реализовал свои собственные функции ленивой загрузки, я понял, что они бессмысленны. Добавляя ленивые загрузчики, как описано выше, вы добавляете ленивый загрузчик во внутренний ленивый загрузчик, что замедляет работу с точки зрения производительности без добавления какого-либо значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...