Предоставляет ли массив Ruby on Rails "has_many" данные по принципу "необходимо знать"? - PullRequest
0 голосов
/ 23 мая 2010

В Ruby on Rails, скажем, если объект модели Actor - это Том Хэнкс, а "has_many" - 20 000 объектов Fan, то

actor.fans

дает массив с 20 000 элементов.Возможно, элементы предварительно не заполнены значениями?В противном случае получение каждого объекта Actor из БД может быть очень трудоемким.

Так что это "необходимо знать"?

Так что он получает данные, когда я получаю доступ к actor.fans[500] и получить данные при доступе к actor.fans [0]?Если он переходит от каждой записи к записи, то он не сможет оптимизировать производительность, выполняя последовательное чтение, которое может быть быстрее на жестком диске, поскольку эти записи могут находиться в соседнем слое сектор / пластина - например, еслипрограмма касается 2-х случайных элементов, тогда быстрее будет просто прочитать эти 2 записи, но что, если она коснется всех элементов в случайном порядке, тогда может быть быстрее просто прочитать все записи последовательно, а затем обработать случайныеэлементы.Но как RoR узнает, делаю ли я только несколько случайных элементов или все элементы случайным образом?

Ответы [ 2 ]

1 голос
/ 23 мая 2010

Посмотрите на SQL, который выдает сервер в режиме разработки, и он скажет вам, сколько фанатских записей загружается. В этом случае actor.fans действительно вызовет их загрузку, что, вероятно, не то, что вы хотите.

У вас есть несколько вариантов:

  • Используйте paginator, как предложено Тадасом;
  • Создайте еще одну ассоциацию с таблицей поклонников, которая включает в себя только те, которые вас интересуют. Это можно сделать с помощью условий из оператора has_many, например,
    has_many :fans, :conditions => "country of residence = 'UK'"
  • Указание полного SQL для сужения строк, возвращаемых с опцией :finder_sql
  • Указание параметра :limit, который, в общем, ограничит число возвращаемых строк.

Все зависит от того, что вы хотите сделать.

1 голос
/ 23 мая 2010

Зачем вам получать 50000 записей, если вы используете только 2 из них?Тогда возьми только те два из БД.Если вы хотите перечислить поклонников, то вы, вероятно, будете использовать разбиение на страницы - то есть использовать лимит и смещение в своем запросе, или какой-нибудь драгоценный камень нумерации страниц, такой как will_paginate.

Я не вижу логического объяснения, почему вы должны идти своим путемк.Объясните реальную ситуацию, чтобы мы могли вам помочь.

Однако есть одна мысль, что вам нужно знать, когда вы загружаете много связанных объектов из БД - используйте: включите как

Actor.all(:include => :fans)

это будет стремиться-загрузите все вентиляторы, чтобы вместо N + 1 было только 2 запроса, где N - количество актеров

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