2010-05-28 3 views
1

Le titre est un peu difficile à mettre en place pour cette question.Rails, ActiveRecord, comment trouver les lignes étrangères qui ne sont pas là?

Disons que j'ai deux modèles, Foo et Bar. Foo a beaucoup de bars. Le bar appartient à un Foo. Comment puis-je utiliser Foo.find pour trouver tous les Foos qui ont actuellement zéro Bars? Dans SQL cela se traduirait par quelque chose comme:

SELECT * from foo where id NOT IN (select foo_id from bar); 

Répondre

2

Foo.all(:conditions => ["id NOT IN (?)", Bar.all.map(&:foo_id)]) le fera, mais il y a des optimisations possibles que vous pouvez prendre à partir de là.

S'il y a des problèmes de vitesse avec cela, vous voudrez peut-être regarder dans un cache de compteur qui transformerait la requête en Foo.find_all_by_bars_count(0)

Documentation sur les caches de compteur est here.

Questions connexes