Dans ce cas, fais un bete truc du genre: Model.find(conditions ...).select(&:playable?) #a condition que ta méthode d'instance soit "playable?"
C'est archi dégueu en règle générale (absolument pas scalable) mais si tu maitrises complètement les dimensions de ton appli, alors te prends surtout pas la tête. Au pire, tu pourras toujours le refactorer plus tard si la question des perfs se pose =). Le 16 mars 2012 10:17, Guillaume Betous <[email protected]> a écrit : > Merci à tous les 2. > > Je précise au passage que les perfos ne sont en rien un soucis, l'ordre > d'idées des dimensions étant une centaine d'entrées maximum, parmi > lesquelles seule 1 ou 2 dizaine seront sélectionnées. > > J'hésite donc entre le flag dans la BdD et l'algorithme de base dans le > controller qui enlève de la collection du find(:all) les mauvais élèves... > le flag est quand meme plus propre oui. > > gUI > > Le 16 mars 2012 09:21, Florian Dutey <[email protected]> a écrit : > > Soit la solution d'olivier, soit tu peux "traduire" ta condition en SQL. >> L'inconvénient est que cela peut te priver de l'eager loading (une requete >> avec des group by / having par exemple) et que cela t'oblige à maintenir 2x >> le code, 1x en ruby, 1x en SQL. >> >> Dans des cas complexes, l'ajout d'un champ calculé dans ta table est >> probablement la "meilleure" solution... à condition d'être sur que le >> contenu du champ est toujours exact =). >> >> Le 16 mars 2012 08:55, Olivier El Mekki <[email protected]> a écrit : >> >> Hello, >>> >>> Le problème ici est que tu vas devoir itérer sur toutes les entrées de >>> ta table db et tester la condition, si tu fais comme tu l'entends. >>> >>> Cela va rapidement poser un problème de performance. >>> >>> La moins mauvaise solution serait de set is_playable en tant que champs >>> dans la db, et de le calculer sur un before_save. Tu peux ensuite >>> utiliser un finder classique. >>> >>> Pour traiter les entrées déjà existante avant cette modif, une task rake >>> fera l'affaire. >>> >>> On 08:50 Fri 16 Mar , Guillaume Betous wrote: >>> > Bonjour, >>> > >>> > J'ai un besoin tout con et j'ai presque honte, je dois passer à >>> côté de >>> > qqchose. Je veux récupérer toutes les instances d'un modèle dont >>> l'appel à >>> > une méthode particulière retourne "true". >>> > >>> > Si j'ai bien tout compris, on ne peut pas utiliser "scope" car >>> c'est basé >>> > sur une méthode de classe (et pas d'instance). >>> > Je ne peux pas non plus utiliser de conditions car c'est la partie >>> SQL de >>> > la requête. >>> > >>> > Je schématise mon besoin : >>> > >>> > Class Depot < AR:B >>> > def is_playable? >>> > return condition_compliquee_qui_est_du_domaine_metier >>> > end >>> > end >>> > >>> > Ensuite, je voudrais faire un truc style : >>> > @depots=Depots.find(:all, :condition=> "is_playable?==true" ) >>> > >>> > Est-ce possible ? Comment le faire proprement ? >>> > >>> > Merci ! >>> > >>> > gUI >>> > >>> > -- >>> > Pour la santé de votre ordinateur, préférez les logiciels libres. >>> > Lire son mail : [1] >>> http://www.mozilla-europe.org/fr/products/thunderbird/ >>> > Browser le web : [2] >>> http://www.mozilla-europe.org/fr/products/firefox/ >>> > Suite bureautique : [3]http://www.libreoffice.org/download/ >>> > >>> > -- >>> > Vous avez reçu ce message, car vous êtes abonné au groupe >>> "Railsfrance" de >>> > Google Groups. >>> > Pour transmettre des messages à ce groupe, envoyez un e-mail à >>> l'adresse >>> > [email protected] >>> > Pour résilier votre abonnement envoyez un e-mail à l'adresse >>> > [email protected] >>> > >>> > References >>> > >>> > Visible links >>> > 1. http://www.mozilla-europe.org/fr/products/thunderbird/ >>> > 2. http://www.mozilla-europe.org/fr/products/firefox/ >>> > 3. http://www.libreoffice.org/download/ >>> >>> -- >>> Olivier El Mekki. >>> >>> -- >>> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" >>> de Google Groups. >>> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse >>> [email protected] >>> Pour résilier votre abonnement envoyez un e-mail à l'adresse >>> [email protected] >>> >> >> -- >> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" >> de Google Groups. >> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse >> [email protected] >> Pour résilier votre abonnement envoyez un e-mail à l'adresse >> [email protected] >> > > > > -- > Pour la santé de votre ordinateur, préférez les logiciels libres. > Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/ > Browser le web : http://www.mozilla-europe.org/fr/products/firefox/ > Suite bureautique : http://www.libreoffice.org/download/ > > -- > Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de > Google Groups. > Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse > [email protected] > Pour résilier votre abonnement envoyez un e-mail à l'adresse > [email protected] > -- Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [email protected]
