будет разбито на несколько таблиц - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть следующие таблицы:

  1. пользователи
  2. аккаунты (учетная запись пользователя has_one)
  3. рисунки (рисунки пользователя has_many)

Я хочу отобразить пользователя вместе с соответствующим аккаунтом и фотографиями.Это типичная проблема с N + 1 запросами, и я решил ее с помощью eager loading .

User.includes(:account, :pictures).all

Я пытаюсь использовать will_paginate gem.Как включить этот нетерпеливый механизм загрузки в will_paginate?

Я нашел похожий вопрос здесь: Использование will_paginate с несколькими моделями (Rails) .Но ссылки в ответе неуместны, а сам ответ довольно старый.Кроме того, он использует необработанные SQL-запросы, которые я не предпочитаю.

Я хочу вывод следующим образом:

user.name account.field1 account.field2 picture.count
abc1       abcf1          abcf2           4
zxc        zxcf1          zxcf2           7

Так что в основном, когда я делаю user.name, он не будет выполнятьсязапрос, но просто получить данные из переменных;таким же образом, когда я делаю user.account.field1, он должен извлечь его из переменной и не выполнять запрос.

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Метод paginate аналогичен методу all.Таким образом, вы можете просто сделать это:

User.includes(:account, :pictures).paginate(
  :page => params[:page], :per_page => 30)

ИЛИ

User.paginate(:include=> [:account, :pictures], 
  :page => params[:page], :per_page => 30)

Примечание:

will_paginategem предоставляет удобный метод для класса Array для нумерации страниц:

[1,2,3,4].paginate(:page => 1, :per_page=>2)
1 голос
/ 14 сентября 2011

Я наконец-то использовал нумерацию страниц в массиве, а не в самом геме.

    current_page = Integer(params[:page]||1)
    per_page = 250
    @users_r = User.all(:conditions=>"some condition",:limit=>per_page,:offset=>per_page*(current_page-1),:include=>[:account,:user_info ,:pictures])
    count = @users_r.length
    @users = WillPaginate::Collection.create(current_page, per_page, count) do |user|
      user.replace(@users_r)
    end
    @users.paginate(params)
...