Rails нетерпеливая загрузка и kaminari

Как использовать активную загрузку при разбиении на страницы с помощью kaminari? Я знаю, что для работы kaminari требуется Relation объект, как получить модели с помощью :include и вернуть Relation объект?
И второй вопрос: почему :include создает sql-запрос для каждой определенной модели, а не создает один большой объединенный запрос?

# match.rb
class Match < ActiveRecord::Base
  has_many :rounds
  has_many :participations
  has_many :players, :through => :participations
  has_many :scores
  has_many :clans, :through => :scores
  belongs_to :clan_1, :class_name => "Clan", :foreign_key => "clan_1_id"
  belongs_to :clan_2, :class_name => "Clan", :foreign_key => "clan_2_id"
  belongs_to :winner, :class_name => "Clan", :foreign_key => "winner_id"
  belongs_to :league
  belongs_to :tournament

# matches_controller.rb
@matches = Match.all(:include=>[:clans,:scores])

Вот что выводит журнал для Match.includes(:clans):

Match Load (18.2ms)  SELECT "matches".* FROM "matches"
Score Load (4.5ms)  SELECT "scores".* FROM "scores" WHERE ("scores".match_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115))
Clan Load (0.5ms)  SELECT "clans".* FROM "clans" WHERE ("clans"."id" IN (1,7,9,2,5,3,4,8,10,6,11,12,13,14,15,16,17,18,19,20))

person methyl    schedule 26.03.2011    source источник
comment
покажи свой код. include возвращает один запрос соединения.   -  person fl00r    schedule 26.03.2011
comment
какую версию рельсов вы используете?   -  person fl00r    schedule 26.03.2011
comment
Я думаю, вам следует попробовать использовать новый синтаксис цепочек запросов Rails ActiveRecors.   -  person fl00r    schedule 26.03.2011


Ответы (2)


В Rails 3.x появился новый синтаксис запросов. Так что попробуй это

@matches = Match.includes(:clans,:scores)
person fl00r    schedule 26.03.2011
comment
Гораздо лучше, потому что он возвращает Relation объект, но по-прежнему генерирует 3 запроса для `Match.includes(:clans). Обновленный вопрос с запросами, посмотрите. - person methyl; 26.03.2011
comment
Но время рендеринга представления увеличивается с 20 до 150 мс при переходе от all(:include) к .includes() - person methyl; 26.03.2011

Попробуй это:

@matches = Match.includes([:clans,:scores]).all()
@matches_paginated = Kaminari.paginate_array(@matches).page(params[:page] || 1).per(20)

# And then
@matches_paginated.each do |m|
  m.clans.each do |c| # should not generate a new query
    c.name # should not generate a new query
  end
end

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

person Benjamin Crouzier    schedule 30.08.2013