Alors, j'ai une application avec deux modèles. FOO HAS_OON BAR, BAR APPARTEMENTS_TO FOO. P>
Maintenant, pour créer un foo, vous devez devoir créer une barre à appartenir, mais il ressemble à quelque chose de glisser dans les fissures car dans mon application de production, je semble maintenant avoir un foo que vous avez créé sans barre , et cela provoque une erreur de 500 erreurs. P>
Maintenant, voici le problème: p>
Je peux rechercher: J'ai besoin de trouver celui qui foo où la barre est nulle. Mais la base de données stocke la relation dans la table des barres, c.-à-d. Bars systable, il n'y a rien dans le foostable pour me dire qu'il manque une barre. P>
Quand j'utilise Alors, quelqu'un peut-il me dire comment construire une requête qui retournerait le seul foo qui manque son bar? P>
merci !! p> bar.Où (: foo => nil) code> juste bien. Mais les barres orphelines ne sont pas un problème, et cela ne me dis pas ce dont j'ai besoin. P>
foo.find (#). Barre code> Je voudrais obtenir nil pour un enregistrement un faux, mais j'ai beaucoup d'enregistrements. P>
3 Réponses :
Je ne suis pas sûr de ce que le code de rubis serait, mais je pense que le SQL devrait être quelque chose comme: p>
Sélectionnez * de FOO Où ID Not In (Sélectionnez FOO_ID à partir de la barre) P>
Cela a fonctionné! - Dans les rails, il s'agit juste de foo.where ("ID non dans (SELECT FOO_ID à partir de la barre)") CODE> Merci!
IMHO, le bon moyen de faire de cela est: foo.joinages (: bar) code>, ce qui donne une requête SQL de
Sélectionnez `mosto`. * À partir de` FOOS` Rejoignez interne `Bars `On` barrs`.`foo_id` = `foos`.`id` code>. Vous pouvez optimiser cette autre chose:
foo.Inclut (: bar) .joings (: bar) code> peut vous enregistrer quelques demandes ultérieures à la DB.
Une autre solution (sans utiliser SQL) serait de faire quelque chose comme: p>
foo.all.select {| f | ! F.Bar} P>
Cela retournerait un tableau d'objets FOO qui n'ont pas d'objet barre connexe. p>
Dans cette méthode, vous ne comptez pas sur des informations de table spécifiques. Si la colonne FOOGERT_KEY devait changer dans le futur FOO -> BAR ASSOCIATION, cette méthode continuerait de fonctionner. P>
Cela sera beaucoup moins performant, car cela entraînera la récupération et l'instanciation des objets AR.
Pour les futurs visiteurs de l'utilisateur Une autre façon d'accomplir cela consiste à faire -
Foo.all.where.not(id: Bar.pluck(:belongs_to_id))