2010-05-07 9 views
16

Estoy usando will_paginate para la paginación, que ha estado funcionando bien hasta ahora, excepto por esta única cosa.will_paginate with named_scopes

Si trato de paginar un ámbito, por ejemplo

class User < ActiveRecord::Base 

    named_scope :scope, lambda { etc } 

end 

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

que me diga paginate es un método no definido. Prefiero no tener que usar una segunda solución solo para este alcance, ¿hay algo que pueda hacer aquí?

Respuesta

9

Lowgain, la versión de klew debería salir de la caja. En su versión debe escribir:

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

Prefiero otro enfoque para la paginación. Permite hacer controlador más limpia y encapsula la paginación a nivel de modelo, por ejemplo:

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 

Y en un controlador de código bastante claro:

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

ps: Settings.admin.per_page - este es Searchlogic configuraciones.

+0

Hmm, ¡esto es interesante! ¿Hay algún tipo de inconveniente de rendimiento notable para hacerlo de esta manera, ya que está paginando cada propiedad? – Lowgain

+0

¿Cómo puede paginar cada propiedad? :) No todos, pero todos. Alcance con nombre * all_properties * es un tipo de método de clase (¡no instancia!). Entonces, cuando llamamos a * self.all_properties *, recibimos todas las propiedades de este alcance nombrado. Luego los paginamos. Auto significa propiedad de clase en sí misma, no objeto de propiedad de clase. – Voldy

2

Tengo un named_scope define así:

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

llamarlo:

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

y funciona. Tal vez necesita algún parámetro para su alcance?

+0

hmm, ¿qué tipo de parámetro esperarías? el alcance parece funcionar fuera de ser paginado – Lowgain

+0

Si su alcance toma el parámetro, entonces debe dar uno. Si no, entonces no;). Mi ejemplo es con el parámetro – klew

2

tipo de solución raro, pero

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

obras?

1

Lowgain, no suena como lo que es, pero solo para asegurarse de que en realidad no está haciendo pruebas con un named_scope llamado scope ¿verdad? Porque ámbito es un método existente y usar eso como su nombre de ámbito provoca un error (y un bucle infinito).

EDIT:

¿Esto sucede a su named_scope para incluir una: cláusula de límite? Acabo de empezar a tener un problema similar. Tengo una respuesta modelo que belongs_to usuario, con un alcance algo llamado así:

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

Y yo estoy viendo los resultados en la consola como esta:

?> 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 

Huy! ¿Cómo puede mi top 3 paginar para producir más de 3 filas?Por su ejemplo Probé su hallazgo (: todos) engañar con resultados similares:

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

Esto parece un error en named_scope, porque puedo tener will_paginate fuera de la imagen y obtener caos similar al producirse:

?> 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 

Hasta ahora, esto solo parece ocurrir cuando uso MySQL. Creo que leí otra publicación en StackOverflow en la que alguien tuvo un problema similar al usar .size con AR results y MySQL, y la solución fue usar siempre .length en sus resultados de AR. He intentado modificar will_paginate para reemplazar todas las instancias de .size con .length, pero desafortunadamente no fue tan simple, pero sospecho que este o un problema similar está afectando de algún modo a will_paginate.

Por el momento, estoy utilizando tu truco de encontrar (: todo) para hackear esto.

+0

Me acabo de dar cuenta de que bloggeé sobre esta misma cosa hace 2 meses, me olvidé de ella y luego la "redescubrí" hoy. ¡Odio volverme senil! – MikeJ

Cuestiones relacionadas