Si j'ai bien compris, ça devrait être dispo pour Rails 2.3 ou 3 : http://ryandaigle.com/articles/200 [...] pe-methods
 
Sinon si tu veux just dynamiquement générer des critères de recherche qui porte sur un seul model, tu peux faire comme ça:
Dans mon cas j'ai nécessairement une recherche par site
Code :
 - def self.super_finder(site_id, search = {})
 -   find_methods = "find_by_site_id"
 -   arguments = [site_id]
 -  
 -   if search
 -     find_methods << "_and_login" and arguments << search[:login] if !search[:login].empty?
 -     find_methods << "_and_id" and arguments << search[:id] if !search[:id].empty?
 -   end
 -   send(find_methods.to_sym, *arguments)
 - end
 
  | 
 
Dans mon controlleur, je l'appelle avec: User.super_finder(site_id, search). Donc si en paramètre de recherche je ne mets rien, ça me génère:
Code :
 - User.find_by_site_id(site_id)
 
  | 
 
Si en paramètre je passe login et id, ça me génére dynamiquement:
Code :
 - User.find_by_site_id_and_login_and_id(site_id, login, id)
 
  | 
C'est plus propre non?  
 
La limite, c'est qu'il faut que les critères de recherche porte sur le même Model. Donc par exemple:
Code :
 - User.find_by_site_id_and_login
 
  | 
ça marche nickel. Mais par exemple si je dois ajouter un critère qui porte sur un champ d'une table jointe, ça ne marche plus, par exemple:
Code :
 - User.find_by_site_and_book_title
 
  | 
Dans ce cas il faut utiliser un named_scope, malheureusement je ne sais pas comment faire par exemple un truc du genre:
Code :
 - find_by_site_id(site_id).booktitle(booktitle)
 
  | 
 
EDIT: le module NamedScope possède une méthode scoped qui m'a l'air importante pour ce que je veux faire. D'ailleurs dans le patch Rails pour les named_scope dynamique c'est ce qui est utilisé, j'ai regardé le code source:  
http://api.rubyonrails.org/classes [...] Scope.html
http://github.com/rails/rails/comm [...] 287afe2b55
 
Message édité par igarimasho le 23-01-2009 à 20:27:27