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

Une situation où ActiveRecord et SQL ne renvoient pas les mêmes résultats en raison d'un OID inconnu traité comme une chaîne

Vous avez ce problème car ActiveRecord ne peut pas reconnaître cette ligne en tant que ligne de votre table de compte. AR n'analyse pas votre sql et vous ne savez pas quoi faire avec le cortage anonyme.

Si vous utilisez find_by_sql vos attributs sélectionnés ne sont pas correctement mappés à votre modèle mais toujours accessibles, alors essayez :

result.id
result.email

Mais vous avez également deux façons de résoudre ce problème.

Premier (c'est une solution très hackish mais facile), transformez votre sql en Arel , valable pour les scopes :

scope :unverified_with_no_associations, -> {
  send(:default_scoped).from(Arel.sql("(SELECT * 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))  
                AS accounts"))

... et appelez la méthode distincte AR :

Account.unverified_with_no_associations.select(:id, :email).distinct

Deuxième (c'est une bien meilleure solution) :

N'utilisez pas sql directement. Réécrivez votre portée avec Arel (https://github.com/rails/arel ) ou avec squeel (https://github.com/activerecord-hackery/squeel )