2008-10-18 22 views
9

Estoy utilizando un simple find all y paginating con willpaginate, pero también me gustaría que la consulta sea ordenada por el usuario. La primera solución que se le ocurrió fue sólo tiene que utilizar un params [:] ordenarRieles: ordenando una consulta por params?

http://localhost:3000/posts/?sort=created_at+DESC 

@posts = Post.paginate :page => params[:page], :order => params[:sort] 

pero el problema con su enfoque es que la consulta puede cumplir los pagos como la clasificación por ID y yo quiero que sea created_at.

¿Es este un enfoque seguro para la clasificación y hay una forma predeterminada de crear_at?

Respuesta

15

que haría uso de un ámbito con nombre para proporcionar el orden predeterminado (disponible desde Rieles 2.1).

deberá añadir el alcance de su modelo de publicación:

named_scope :ordered, lambda {|*args| {:order => (args.first || 'created_at DESC')} } 

A continuación, puede llamar a:

@posts = Post.ordered.paginate :page => params[:page] 

el ejemplo anterior se utilizará el orden predeterminado de la named_scope (created_at DESC), pero también puede proporcionar uno diferente:

@posts = Post.ordered('title ASC').paginate :page => params[:page] 

Puede usar t sombrero con la sugerencia de Rómulo:

sort_params = { "by_date" => "created_at", "by_name" => "name" } 
@posts = Post.ordered(sort_params[params[:sort]]).paginate :page => params[:page] 

Si params[:sort] no se encuentra en sort_params y devuelve a continuación nilnamed_scope caerá de nuevo a usar el orden predeterminado.

Railscasts tiene mucha información sobre named_scopes.

2

En general, la manera de proporcionar valores predeterminados para Hash y Hash-como objetos es utilizar fetch:

params.fetch(:sort){ :created_at } 

Mucha gente sólo tiene que utilizar || sin embargo:

params[:sort] || :created_at 

prefiero fetch mismo que soy más explícito, además no se rompe cuando false es un valor legítimo.

1

lenguaje Ruby para fijar un defecto que:

@posts = Post.paginate :page => params[:page], :order => params[:sort] || "created_at" 

embargo, el enfoque no es seguro. El método de paginación no molestará con un parámetro como "created_at; DROP DATABASE mydatabase;". En su lugar, se puede usar un diccionario de parámetros de clasificación válidos (no probado):

sort_params = { "by_date" => "created_at", "by_name" => "name" } 

@posts = Post.paginate :page => params[:page], :order => sort_params[params[:sort] || "by_date"] 

Para que el URI se convierte en:

http://localhost:3000/posts/?sort=by_date 
1

prefiero este idioma:

@posts = Post.paginate :page=>page, :order=>order 
... 

def page 
    params[:page] || 1 
end 

def order 
    params[:order] || 'created_at ASC' 
end 
Cuestiones relacionadas