Массив Ruby on Rails «Has_Many» предоставляет данные о «надо знать» основой?

StackOverflow https://stackoverflow.com/questions/2891940

Вопрос

На Ruby на рельсах, скажем, если объект Actor Model - Том Хэнкс, а поклонники «HAS_MANY» - 20 000 объектов вентилятора, затем

actor.fans

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

Так что это на «надо знать» основа?

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

Это было полезно?

Решение

Почему вы хотите получить 50000 записей, если вы используете только 2 из них? Затем извлеките только те два из БД. Если вы хотите перечислить поклонникам, вы, вероятно, будете использовать Pagination - IE Используйте предел и смещение в вашем запросе, или какой-то диаграмма Paginate Gem, как WILL_PAGINATION.

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

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

Actor.all(:include => :fans)

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top