Подтвердить что ты не робот

Will_paginate with named_scopes

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

Если я пытаюсь разбивать страницы на область, например

class User < ActiveRecord::Base

    named_scope :scope, lambda { etc }

end

User.scope.paginate({:page => params[:page], :per_page => 10})

Это скажет мне, что paginate - это метод undefined. Я бы предпочел не использовать второе решение только для этой области, есть ли что-то, что я могу здесь сделать?

4b9b3361

Ответ 1

Lowgain, версия klew должна работать из коробки. В вашей версии вы должны написать:

User.scope.paginate :page => params[:page], :per_page => 10

Я предпочитаю другой подход к разбивке на страницы. Это позволяет сделать контроллер более чистым и инкапсулировать разбиение на страницы на уровне модели, например:

class Property < ActiveRecord::Base
  named_scope :all_properties, lambda {{ :order => "name asc" }}

  def self.admin_properties(page = 1)
    self.all_properties.paginate(:page => page, :per_page => Settings.admin.per_page)
  end
end

И в контроллере довольно чистый код:

class Admin::PropertiesController < Admin::AdminController
  def index
    @properties = Property.admin_properties(params[:page])
  end
end

p.s: Settings.admin.per_page - это Searchlogic.

Ответ 2

У меня есть named_scope, как это:

 named_scope :look_for, lambda { |search| bla;bla;bla }

Я называю это:

 Person.look_for(params[:search]).paginate :page => params[:page]

И это работает. Может быть, вам нужен какой-то параметр в вашей области?

Ответ 3

Вид странного решения, но

User.scope.find(:all).paginate :page => params[:page], :per_page => 10

работы?

Ответ 4

Lowgain, это не похоже на то, что вы есть, но просто для того, чтобы убедиться - вы на самом деле не выполняете тесты с named_scope с именем scope right? Поскольку scope является существующим методом и использует это, поскольку ваше имя области вызывает ошибку (и бесконечный цикл).

EDIT:

Имеет ли ваш named_scope параметр a: limit? Я просто начал иметь аналогичную проблему. У меня есть модель Response, которая принадлежит пользователю, с именованной областью что-то вроде этого:

named_scope :top, lambda { |limit| {
            :limit => limit,
            :order => 'total_score DESC' }}

И я вижу результаты в консоли, например:

?> u = User.find 1
?> u.responses.length
=> 9
?> u.responses.paginate(:page => 1, :per_page => 5).length
=> 5
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).paginate(:page => 1, :per_page => 5).length
=> 5

Хлоп! Как может моя верхняя 3-страничная страница создавать более 3 строк? В вашем примере я попробовал твой прием (: все) с похожими результатами:

?> u.responses.top(3).find(:all).paginate(:page => 1, :per_page => 5).length
=> 3

Это выглядит как ошибка в named_scope, потому что я могу взять will_paginate из изображения и получить подобный хаос:

?> u.responses.top(3).length
=> 3
?> u.responses.top(3).size
=> 9                       <-- .size produces wrong answer
?> r = u.responses.top(3)
?> r.size
=> 3                       <-- correct when result assigned to var

До сих пор это только случается, когда я использую MySQL. Я думаю, что я прочитал еще одно сообщение в StackOverflow, где у кого-то была аналогичная проблема с использованием .size с результатами AR и MySQL, и решение всегда должно было использовать .length для их результатов AR. Я пробовал модифицировать will_paginate, чтобы заменить все экземпляры .size на .length, но, увы, это было не так просто, но я подозреваю, что эта или аналогичная проблема каким-то образом влияет на will_paginate.

В настоящее время я использую трюк find (: all), чтобы взломать это.