Recherche multi criteres

Bonjour à tous,

et oui mon don d’ubiquité mle permet à la fois de mettre la patée Ã
Nicolas Mahut et de vous posez des questions !

quelle est selon vous la meilleure facon d’implementer une recherche
multi critère sous rails?

je pensais faire un truc du style

@court1s = Court.find(:all, :conditions => condition1)
@court2s = @court1s.find(:all, :conditions => condition2)

mais ca marche pas des masses

une idee ?

merci

Richard :

et oui mon don d’ubiquité mle permet à la fois de mettre la
patée à Nicolas Mahut et de vous posez des questions !

Le match est pas fini, on rigolera moins si tu perds en 5 sets.

quelle est selon vous la meilleure facon d’implementer une
recherche multi critère sous rails?

je pensais faire un truc du style

@court1s = Court.find(:all, :conditions => condition1)
@court2s = @court1s.find(:all, :conditions => condition2)

La question est vague, si c’est une recherche simple,
genre sur des colonnes d’une table, alors tu peux faire :

users = User.find :all, :conditions => { :name => name,
:firstname => firstname, :password => password, … }

ou si tu n’as que 2 critères

users = User.find_all_by_name_and_firstname(name, firstname)

si c’est plus compliqué t’as le classique
:conditions avec un tableau :

par exemple :

users = User.find :all, :conditions => [‘lower(name) LIKE ? AND
lower(firstname) LIKE ?’, “%#{name}%”, “%#{firstname}%” ]

– Jean-François.


À la renverse.

Ouais mais non, il a
gagné.Bravo Richard

Le 29 mai 07 à 15:58, Jean-François a écrit :

– Jean-François.


À la renverse.


Frédéric de Villamil
[email protected] tel: +33 (0)6 62 19 1337
http://fredericdevillamil.com Typo : http://typosphere.org

Jean-François wrote:

Richard :

et oui mon don d’ubiquit� mle permet � la fois de mettre la
pat�e � Nicolas Mahut et de vous posez des questions !

Le match est pas fini, on rigolera moins si tu perds en 5 sets.

j’ai pas tremblé !

si c’est plus compliqu� t’as le classique
:conditions avec un tableau :

par exemple :

users = User.find :all, :conditions => [‘lower(name) LIKE ? AND
lower(firstname) LIKE ?’, “%#{name}%”, “%#{firstname}%” ]

C’est ce cas la qui m’interesse en fait.
en fait je voudrais fairte une recherche selon 5 colonnes d’une table en
melangeant du >, du =, du like … en n’oubliant pas que qd rien n’est
selectionné par défaut ds un champ cela ne doit pas faire de filtre sur
ce dernier bien sur.

je me demandais donc s’il ny avait pas un moyen de filtrer d’abord le
premier champ, ce qui m’aurait donné un premier objet, puis de filter
cet objet et ainsi de suite …

Donc rien de plus simple que de faire un truc comme ca :

region = params[:region].to_i
signe = params[:signe].to_i
pourc = params[:pourc].to_f



if pourc == 0 and region == 0
  conditions = nil
elsif not pourc == 0
  if not region == 0
    conditions = ["region_id = ? AND pourcentage_k > ?", region, 

pourc ]
else
case signe
when 1
conditions = [“pourcentage_k > ?”, pourc ]
when 2
conditions = [“pourcentage_k = ?”, pourc ]
when 3
conditions = [“pourcentage_k < ?”, pourc ]
end
end
elsif not region == 0
conditions = [“region_id = ?”, region]
end

On May 29, 4:53 pm, Richard G. [email protected]
wrote:

    conditions = ["region_id = ? AND pourcentage_k > ?", region,
  end
elsif not region == 0
  conditions = ["region_id = ?", region]
end


Posted viahttp://www.ruby-forum.com/.

Richard,il existe une methode interessante dans activerecord
with_scope

un tres bon article sur cette methode http://errtheblog.com/post/41

un grand merci à tous pour votre aide !!!

je vous laisse car je dois me concentrer sur le belge !

Richard :

      when 1
        conditions = ["pourcentage_k > ?", pourc ]
      when 2
        conditions = ["pourcentage_k = ?", pourc ]
      when 3
        conditions = ["pourcentage_k < ?", pourc ]
    end
  end
elsif not region == 0
  conditions = ["region_id = ?", region]
end

Ton code est pas immédiatement compréhensible, ya plein
de if.

Dans ton exemple, on pourrait le réécrire comme ça, si j’ai
bien compris ton code :

SIGNES = [nil] + %w(> = <)

region = params[:region].to_i
signe = params[:signe].to_i
pourc = params[:pourc].to_f

conditions, arguments = [], []

unless region == 0
conditions << ‘(region_id = ?)’
arguments << region
end

unless pourc == 0
conditions << “(pourcentage_k #{ SIGNES[signe] } ?)”
arguments << pourc
end

si d’autres paramètres…

même principe on rajoute une condition SQL au tableau condition et

un argument au tableau arguments

courts = if conditions.empty?
Court.find(:all)
else
Court.find(:all, :conditions => [conditions.join(’ AND '), *arguments]
)
end

Sinon autre solution et/ou source d’inspiration, le plugin
resultset-autofilter de fredix :

http://code.google.com/p/resultset-autofilter

overkill ou pas, selon ton problème réel.

Sinon le fait de prendre une collection d’enregistrements et
de la filtrer jusqu’à obtenir la collection voulue, c’est possible
mais cela consiste à faire le boulot par Ruby et non par le
sgbdr.

– Jean-François.


À la renverse.

Le 30/05/07, Richard G.[email protected] a écrit :

un grand merci à tous pour votre aide !!!

je vous laisse car je dois me concentrer sur le belge !

J’ai l’impression que tu vas pouvoir te consacrer totalement à
ton appli Rails.

– Jean-François.


À la renverse.

Bonsoir Richard,

Tu peux déja commencer par regarder du coté des différents plugins comme
acts_as_searchablehttp://poocs.net/articles/2006/04/06/introducing-acts_as_searchable,
acts_as_ferret http://projects.jkraemer.net/acts_as_ferret/wiki ou
Active
Search
http://julik.textdriven.com/svn/tools/rails_plugins/simple_search/.
Il y a aussi une page consacrée à ce sujet sur le Wiki
http://wiki.rubyonrails.org/rails/pages/FullTextSearch

Le 29/05/07, Richard G. [email protected] a écrit :

Le 30 mai 07 à 18:04, Jean-François a écrit :

Le 30/05/07, Richard G.[email protected] a écrit :

un grand merci à tous pour votre aide !!!

je vous laisse car je dois me concentrer sur le belge !

J’ai l’impression que tu vas pouvoir te consacrer totalement à
ton appli Rails.

Je me demande juste comment il a fait pour poster en plein match à un
moment où il n’était pas arrêté… mjdcjdr


Frédéric de Villamil
[email protected] tel: +33 (0)6 62 19 1337
http://fredericdevillamil.com Typo : http://typosphere.org

J’ai oublié, tu as aussi

http://blog.invisible.ch/2006/01/02/where-plugin/

(http://www.railsfrance.org/node/264#comment)

Requete google : recherche multicritère rails (4° resultat …)

Le 30/05/07, loiseau Gaetan [email protected] a écrit :

On 5/30/07, loiseau Gaetan [email protected] wrote:

J’ai oublié, tu as aussi

http://blog.invisible.ch/2006/01/02/where-plugin/

(http://www.railsfrance.org/node/264#comment )

Requete google : recherche multicritère rails (4° resultat …)

Dans le genre il vaut mieux utiliser ez-where c’est plus puissant avec
une
mini gestion des relations
http://brainspl.at/articles/2006/06/30/new-release-of-ez_where-plugin

Le dev n’est plus pas actif mais jusqu’Ã maintenant le plugin est
maintenu
pour rester compatible avec les release de rails

Ceci dit IMHO ce genre d’approche type DSL charmant sur le papier est
d’un
intéret limité pour faire du multicritère/multi operateur, c’est juste
un
moyen élégant de hardcoder des conditions légèrement dynamique de facon
élégante.

le code:

  else
  conditions = ["region_id = ?", region]
end

est strictement équivalent à (syntaxe approximative, je ne sais pas si
le
typecast automatique vers Float fonctionnera)

EzWhere::Condition.new do
region_id = params[:region]
pourcentage_k > params[:pourc] if params[:signe] == 1
pourcentage_k = params[:pourc] if params[:signe] == 2
pourcentage_k < params[:pourc] if params[:signe] == 3
end

Bien mais pas top surtout pour le mapping http → sql quand il y a des
opérateurs dynamique en jeu, on perd rapidement le coté DRY.