will_paginate с named_scopes

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

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

class User < ActiveRecord::Base

    named_scope :scope, lambda { etc }

end

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

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

16
задан Lowgain 7 May 2010 в 22:45
поделиться

4 ответа

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 .

9
ответ дан 30 November 2019 в 22:55
поделиться

У меня есть named_scope , определенный следующим образом:

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

Я называю его:

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

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

2
ответ дан 30 November 2019 в 22:55
поделиться

Странное решение, но

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

работает?

2
ответ дан 30 November 2019 в 22:55
поделиться

Лоугейн, это не похоже на вас, но просто чтобы убедиться - вы на самом деле не проводите тесты с 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), чтобы обойти это.

1
ответ дан 30 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: