PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Eine Situation, in der ActiveRecord und SQL nicht die gleichen Ergebnisse zurückgeben, weil eine unbekannte OID als Zeichenfolge behandelt wird

Sie haben dieses Problem, weil ActiveRecord diese Zeile nicht als Zeile aus Ihrer Kontotabelle erkennen kann. AR analysiert Ihr SQL nicht und es ist nicht sicher, was mit anonymem Cortage zu tun ist.

Wenn Sie find_by_sql verwenden Ihre ausgewählten Attribute sind Ihrem Modell nicht richtig zugeordnet, aber immer noch zugänglich, versuchen Sie es also:

result.id
result.email

Aber Sie haben auch zwei Möglichkeiten, das zu beheben.

Zuerst (es ist eine sehr hackige, aber einfache Lösung), wandeln Sie Ihr SQL in Arel um , die für die Bereiche gilt:

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"))

... und rufe die eindeutige AR-Methode auf:

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

Zweiter (es ist viel bessere Lösung):

Verwenden Sie SQL nicht direkt. Schreiben Sie Ihren Geltungsbereich mit Arel neu (https://github.com/rails/arel ) oder mit squeel (https://github.com/activerecord-hackery/squeel )