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. Я бы предпочел не использовать второе решение только для этой области, есть ли что-то, что я могу здесь сделать?
Ответы
Ответ 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), чтобы взломать это.