Я использую will_paginate для разбиения на страницы, которое работало хорошо до сих пор, за исключением этой вещи.
Если я пытаюсь нумеровать страницы объем, например
class User < ActiveRecord::Base
named_scope :scope, lambda { etc }
end
User.scope.paginate({:page => params[:page], :per_page => 10})
Это скажет мне, нумеруют страницы, неопределенный метод. Я не должен использовать второе решение только для этого объема, есть ли что-то, что я могу сделать здесь?
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
ps: Settings.admin.per_page - это Настройки Searchlogic .
У меня есть named_scope
, определенный следующим образом:
named_scope :look_for, lambda { |search| bla;bla;bla }
Я называю его:
Person.look_for(params[:search]).paginate :page => params[:page]
И он работает. Может быть, вам нужен какой-то параметр для вашей области?
Странное решение, но
User.scope.find(:all).paginate :page => params[:page], :per_page => 10
работает?
Лоугейн, это не похоже на вас, но просто чтобы убедиться - вы на самом деле не проводите тесты с named_scope с именем scope , верно? Поскольку scope - это существующий метод, и его использование в качестве имени вашей области приводит к ошибке (и бесконечному циклу).
РЕДАКТИРОВАТЬ:
Есть ли в вашем named_scope предложение: 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
Ура! Как мои три верхних страницы разбиваются на страницы, чтобы получить более трех строк? В вашем примере я попробовал ваш трюк с find (: all) с аналогичными результатами:
?> 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), чтобы обойти это.