Manipuler des tableaux d'objects issus de la base de données

Bonjour,

Souvent avec Rails on fait quelque chose du genre @products =
Product.find(:all)

Et on se retrouve à vouloir faire des actions sur @products.

Existe-il un moyen simple pour définir des méthodes sur de tels arrays
@products issus d’une base de données ?

Par exemple, où peut-on définir la méthode @products.filtrer ?

Je vous remercie,

Pierre

Bonsoir,

Dans le modèle (app/models/product.rb) :slight_smile:

++

Le 30 sept. 07 à 22:24, [email protected] a écrit :

Par exemple, où peut-on définir la méthode @products.filtrer ?

Je vous remercie,

Pierre

Jordan B.
CEO, eloas sarl

Mais si je déclare une méthode dans Class Product, elle ne
s’appliquera pas à un array d’objet Product non ?

Mhmm… L’objet retourné par un appel à find n’est pas vraiment un
Array. C’est un “Association Proxy”. Et on peut faire des choses
intéressantes avec cet objet. Il y a un très bon article en anglais à
ce sujet :
http://www.pivotalblabs.com/articles/2007/08/08/advanced-proxy-usage-part-i
(un peu trop long pour que je le traduise ou que je le résume).

++

yk

Le 01/10/07, renaud morvan[email protected] a écrit :

On 10/1/07, Pierre V. [email protected] wrote:

Mais si je déclare une méthode dans Class Product, elle ne
s’appliquera pas à un array d’objet Product non ?

La méthode classique est l’idom @products.collect &:method ce qui est
équivalent à @products.collect {|p| p.method }

Malheureusement (?) un resultset dans rails n’est qu’une instance de
Array
donc si tu veux lui rajouter des methodes il te faudra l’encapsuler dans
un
objetProxy ou pour ton cas simple surcharger la classe Array.

IMHO pour ton exemple @resultset.map &:destroy, @resultset.collect &:id
ou
même @resultset.find_all &:spam? sont suffisamment DRY, sans compter que
dans le vrai monde ce genre de chose devrait être fait coté SQL pour
éviter
l’overhead.

Maintenant si tu veux rajouter des fonctionnalités complexe genre
pagination, taxonomy, import massif ou conversion, alors les décisions
d’architectures sont à prendre au cas par cas, to_csv a plus sa place
comme
method d’instance de Array que next_page…

Renaud

On 10/1/07, Yann KLIS [email protected] wrote:

Mhmm… L’objet retourné par un appel à find n’est pas vraiment un
Array. C’est un “Association Proxy”. Et on peut faire des choses
intéressantes avec cet objet. Il y a un très bon article en anglais Ã
ce sujet :

http://www.pivotalblabs.com/articles/2007/08/08/advanced-proxy-usage-part-i
(un peu trop long pour que je le traduise ou que je le résume).

Malheureusement je ne pense pas.

AssociationProxy et ses extensions ne sont utilisées que par les
associations afin de faire un proxy autour du resultSet pour justement
n’executer la requête qu’en cas de besoin. Et effectivement on peut
faire
plein de truc super avec.

Dans le cas d’un find, on a aucun niveau d’abstraction sur lequel se
reposer.

Renaud

J’en profite pour ajouter d’autres points de vue sur la question.
http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/f8fda4fd2975a716#1ac5e277293b2754

@Yann : merci pour votre article.

J’ai trouvé ça, très pratique :

has_many :assets do
def to_s
self.join(’,’)
end
end

Merci.