Как вы делаете загрузку с ограничениями? - PullRequest
12 голосов
/ 25 июня 2011

В документации для активной загрузки указано, что:


Если вы хотите загрузить ассоциацию с указанным параметром: limit, она будет проигнорирована, возвращая все связанные объекты:

class Picture < ActiveRecord::Base
  has_many :most_recent_comments, :class_name => 'Comment', 
                                  :order => 'id DESC', :limit => 10
end

Picture.find (: first,: include =>: most_recent_comments) .most_recent_comments # => возвращает все связанные комментарии.


В этом случаетогда каков наилучший способ достижения «предела» по загрузке?

Допустим, мы стремимся загрузить последние 10 постов в блог на первую страницу блога, мы явно не хотим их всех, поэтому следует ли указывать лимит и порядок сбора записей?

Кроме того, можно ли указать те же условия для элементов, которые глубоко загружены - например, отображать только первые три комментария к каждому сообщению в блоге?

Blog.find(:blog_id, :include => {:posts => :comments } )

Ответы [ 3 ]

5 голосов
/ 08 марта 2013

Я полагаю, это потому, что команда LIMIT в sql плохо переводит то, что вы пытаетесь сделать.LIMIT ограничит общее количество строк, возвращаемых запросом.Вы не пытаетесь сделать это все же.Вы пытаетесь ограничить количество строк, соединяемых для каждого возвращаемого изображения.Чтобы достичь этого эффекта, вам придется использовать сложный SQL, который может быть трудно оптимизировать, если ваши таблицы большие.В этот момент я хотел бы рассмотреть, почему вы пытаетесь ограничить количество загружаемых строк.

Если максимальное количество загружаемых комментариев является управляемым (<2000 или около того), вам, вероятно, не стоит беспокоиться об ограничении SQLend. </p>

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

Вы должны позволить сферам делать грязную работу за вас, а не за общение.Это способствует повторному использованию, ремонтопригодности, удобочитаемости.Пример:

Class Picture < ActiveRecord::Base
  has_many :comments, :order => 'id DESC' do
    def recent
      limit(10)
    end
  end
end

Таким образом, .comments существует, когда вам это нужно, и вы также можете ограничить его следующим образом:

@picture.comments.recent
0 голосов
/ 10 июня 2014

Я использовал will_paginate, чтобы выручить меня вместе с энергичной загрузкой (using includes), так как мне нужно было загрузить много связанных моделей за один снимок без , используя limit

Image.includes(:user,:tags).where("user_id !=?",current_user.id).paginate(:page => params[:page], :per_page => 15)

ИЛИ (без will_paginate ( с использованием limit)

Image.includes(:user,:tags).where("user_id !=?",current_user.id).limit(30).order("created_at ASC")

... попробуй ... надеюсь, это поможет.

0 голосов
/ 25 июня 2011

Вы можете использовать эту конструкцию: Picture.find(:first, :include => :most_recent_comments).most_recent_comments.limit(10)

Подробнее в AR guide

...