Manipuler le résultat d'un collection d'en registrement

Bonjour,

Soit le modèle suivant :

class FirstModel < ActiveRecord::Base
belongs_to :second_model
end

class SecondModel < ActiveRecord::Base
has_many :first_models
end

m = SecondModel.first

j’aimerais ajouter des méthodes spécifiques pour manipuler (effectuer
des traitement en ruby) la collection (Array) m.first_models.

Ma première solution a été d’ajouter des méthodes à la classe Array
mais le soucis c’est que pour chaque tableau ces méthodes sont
disponibles.

J’ai vu qu’on pouvait peut être utiliser le pattern Proxy mais je ne
vois vraiment pas comment faire.

Si quelqu’un peut m’aider.

Merci

Salut,

Donne nous un exemple précis. Sinon toutes les méthodes d’Enumerable
devraient convenir à la plupart des besoins.

Le 4 septembre 2009 16:42, Antoine CRESSON [email protected] a
écrit :

Par exemple on a une catégorie avec un certains nombre d’articles
j’aimerais pouvoir trouver tous les articles dont la longueur dépasse
1000 caractères (le traitement se fera en ruby pour trouver les
articles correspondants) j’aimerais pouvoir avoir accès à ces articles
de la manière suivante :

cat = Category.first
cat.articles.more_than_1000_chars

Ça prend 1 ligne avec la méthode inject :slight_smile:

cat.articles.inject([]) { |articles, article| article.text.size > 1000 ?
articles << article : articles }

Par contre pour ce besoin spécifique je regarderai du côté du SGBDR s’il
ne
peut pas filtrer avec un where la longueur des articles. Un named scope
simple et écrire et plus de perfs :slight_smile:

Le 4 septembre 2009 19:47, Antoine CRESSON [email protected] a
écrit :

Un truc aussi basique ce serait beaucoup mieux de le faire faire à la
base
de données, rapport aux performances ; un where pourrait sans doute
suffire,
ça dépend si tu veux être complètement sql agnostique.

Michel B.

2009/9/4 Alexis B. [email protected]

class Article < ActiveRecord::Base named_scope :longest, :conditions =>
“length(size) > 1000”
end

ma_category.articles.longest

Paf !
Nicolas.

Le 4 septembre 2009 20:30, Michel B.
[email protected] a
écrit :

Merci pour vos contributions, effectivement l’utilisation de
named_scope semble être une bonne solution.