¿Como hacéis los filtros de los lista dos?


#1

Hola a tod@s!!,

Estoy desarrollando una aplicación que contiene gran cantidad de
listados y
filtros sobres los mismos: rangos de fechas, valores máximos y mínimos
etc

Hasta la fecha he creado los filtros de una forma un poco “sucia” y me
gustaría saber como hacerlo (o por lo menos la teoría) de una forma mas
limpia y reutilizable.

He visto este screenncast
http://railscasts.com/episodes/111-advanced-search-form y creo que es la
forma correcta de hacer filtros ,pero no me queda muy claro.

¿Como lo hacéis vosotros?

Me conformo solo con la teoría, aunque si me posteais algo de código,
mejor
:stuck_out_tongue:

Mil gracias!!!


#2

2009/5/24 Pedro Marín removed_email_address@domain.invalid

Estoy desarrollando una aplicación que contiene gran cantidad de listados y
filtros sobres los mismos: rangos de fechas, valores máximos y mínimos etc
¿Como lo hacéis vosotros?

A mi me gusta usar names scopes

class User

named_scope :with_something_dificult {|param|
return {} if param.blank?
id = OtherModel.find(:select => “user_id”, :conditions =>
…).map(&:user_id)

Si la operación es muy compleja y no la puedo sacar con simples

joins o
group
{:conditions => [“users.id IN (?)”,id]}
}

named_scope :with_name_like, proc {|name|
return {} if name.blank?
{:conditions => [“users.name like ?”, “%#{name}%”]}
}

named_scope :with_name_like, proc {|email|
return {} if email.blank?
{:conditions => [“users.email like ?”, “%#{email}%”]}
}

end

class UsersController < AdminController

def index
@users = User.
with_name_like(params[:user]).
with_email_like(params[:email]).
with_something_dificult(params[:raro]).
paginate(:page => params[:page] || 1)
end
end

Aunque no me acaba de convencer del todo, es la más elegante que
conozco.
Tal vez alguien sepa alguna manera más elegante de hacerlo.


#3

Gracias Guillermo,

después de echarle unas horas mas he conseguido hacer esto.

Me he creado la clase Filtro: Filtro.rb
*
*class Filtro
attr_accessor :provincia_id, :tipo, :condiciones

def initialize(options = {})
unless options.nil?
@provincia_id = options[:provincia_id].to_i || nil
@tipo = options[:tipo] || nil
@condiciones ||= crea_condiciones
else
@provincia_id = nil
@tipo = “”
@condiciones = “”
end

end

private

#Definimos que campos van a actuar en el filtro
def provincia_filtro
[“provincia_id = ?”, provincia_id ] unless provincia_id.blank?
end

def tipo_filtro
[“tipo = ?”, self.tipo ] unless tipo.blank?
end

Juntamos las condiciones

def crea_condiciones
[sql_condiciones.join(’ AND '), *valores_condiciones]
end

def sql_condiciones
partes_condiciones.map {|c| c.first }
end

def valores_condiciones
partes_condiciones.map {|c| c[1…-1] }.flatten
end

#Busca todos los metodos que definen el filtro
def partes_condiciones
private_methods(false).grep(/_filtro$/).map {|c| send©}.compact
end

end

En el controlador en que vayamos lo usamos así:

@filtro = Filtro.new(params[:filtro])
@listado = Marker.find(:all, :conditions =>@filtro.condiciones)

En la vista ponemos lo siguienete:

<% form_for @filtro, :url=>listado_localizador_url,:html=>{
:method=>:get}
do |f| %>
Provincia: <%= f.select :provincia_id, Provincia.listado , {
:include_blank => true }%>
Tipo Barrera: <%= f.select :tipo, Marker.tipos, { :include_blank =>
true }
%>
<%= f.submit “Buscar”, :name=>nil %>
<% end %>

¿Sugerencias?

El 24 de mayo de 2009 13:04, Pedro Marín removed_email_address@domain.invalid escribió:


#4

Yo estoy empezando a utilizar SearchLogic. Los filtros no dejan de ser
una
búsqueda por campos fijos.

http://www.binarylogic.com/2008/09/01/searchlogic-released/

– Gaizka

El día 24/05/09 17:53 +0200, Pedro Marín escribió:

unless options.nil?


partes_condiciones.map {|c| c[1..-1] }.flatten

Provincia: <%= f.select :provincia_id, Provincia.listado , {

Hola a tod@s!!,
http://railscasts.com/episodes/111-advanced-search-form y creo que es la


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

– Gaizka Villate


Gaizka Villate
removed_email_address@domain.invalid

The Cocktail
C/ Salamanca 17
28020 Madrid
+34 91 567 06 05

www > http://the-cocktail.com


#5

Parece bastante interesante SearchLogic, no lo conocia, gracias.

Yo estoy usando AR-Extensions que es parecido pero creo que no tan
completo.

http://rubyforge.org/frs/?group_id=2113

salu2

Gaizka wrote:

Yo estoy empezando a utilizar SearchLogic. Los filtros no dejan de ser
una
búsqueda por campos fijos.

http://www.binarylogic.com/2008/09/01/searchlogic-released/

– Gaizka

El día 24/05/09 17:53 +0200, Pedro Marín escribió:

unless options.nil?


partes_condiciones.map {|c| c[1..-1] }.flatten

Provincia: <%= f.select :provincia_id, Provincia.listado , {

Hola a tod@s!!,
http://railscasts.com/episodes/111-advanced-search-form y creo que es la


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

– Gaizka Villate


Gaizka Villate
removed_email_address@domain.invalid

The Cocktail
C/ Salamanca 17
28020 Madrid
+34 91 567 06 05

www > http://the-cocktail.com


#6

También puedes hacerlo en AJAX

http://code.google.com/apis/ajax/playground/#table

El día 25 de mayo de 2009 11:32, Victor C.
removed_email_address@domain.invalid escribió:

Yo estoy empezando a utilizar SearchLogic. Los filtros no dejan de ser


The Cocktail
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es