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