Forum: Rails-ES ¿Como hacéis los filtros de los lista dos?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Pedro Marín (Guest)
on 2009-05-24 15:04
(Received via mailing list)
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
:P

Mil gracias!!!!
Guillermo (Guest)
on 2009-05-24 18:58
(Received via mailing list)
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.
Pedro Marín (Guest)
on 2009-05-24 19:53
(Received via mailing list)
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(c)}.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ó:
Gaizka (Guest)
on 2009-05-25 12:37
(Received via mailing list)
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
Victor C. (Guest)
on 2009-05-25 13:32
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
Emili P. (Guest)
on 2009-05-25 14:58
(Received via mailing list)
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
>



--
This topic is locked and can not be replied to.