sql >> Base de Datos >  >> RDS >> PostgreSQL

Una situación en la que ActiveRecord y SQL no devuelven los mismos resultados debido a que el OID desconocido se trata como una cadena

Tiene este problema porque ActiveRecord no puede reconocer esta fila como una fila de su tabla de cuentas. AR no analiza su sql y no está seguro de qué hacer con el corte anónimo.

Si usa find_by_sql sus atributos seleccionados no están asignados a su modelo correctamente pero aún están accesibles, así que intente:

result.id
result.email

Pero también tienes dos formas de solucionarlo.

Primero (es una solución muy hackish pero fácil), transforma tu sql a Arel , que es válido para los ámbitos:

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

... y llame al método distinto de AR:

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

Segundo (es una solución mucho mejor):

No use sql directamente. Reescriba su alcance con Arel (https://github.com/rails/arel ) o con squeel (https://github.com/activerecord-hackery/squeel )