PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment est-il possible que la requête SQL et ActiveRecord.find_by_sql renvoient des résultats différents ?

Vous avez le bon résultat dans les deux exemples.

Si vous utilisez uniquement count dans select, vous obtenez toujours un nombre à la suite d'une requête. Donc, votre résultat de la base de données est prévisible.

Dans le cas des rails, vous essayez d'obtenir un ensemble d'enregistrements par scope avec count dans l'instruction select. On peut s'attendre à avoir un ensemble vide si vous avez count dans votre requête.

Essayez count_by_sql méthode http://apidock.com/rails/ActiveRecord/Base/count_by_sql/class pour obtenir le nombre d'enregistrements au lieu d'un ensemble vide.

Et utilisez-le sans portée, mais avec la méthode de classe :

def self.unverified_with_no_associations()
  self.count_by_sql("SELECT COUNT(DISTINCT(accounts.id, accounts.email)) FROM accounts WHERE level = 0 AND id NOT IN
            (SELECT DISTINCT(account_id) FROM verifications) AND id NOT IN 
            (SELECT DISTINCT(account_id) FROM positions) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM edits) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM posts) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM reviews) AND id NOT IN
            (SELECT DISTINCT(sender_id) FROM kudos) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM stacks WHERE account_id IS NOT NULL)")
end