PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Uma situação em que ActiveRecord e SQL não retornam os mesmos resultados devido ao OID desconhecido sendo tratado como String


Você tem esse problema porque o ActiveRecord não pode reconhecer esta linha como linha da sua tabela de contas. AR não analisando seu sql e não tem certeza do que fazer com corte anônimo.

Se você usar find_by_sql seus atributos selecionados não mapeados para seu modelo corretamente, mas ainda acessíveis, então tente:
result.id
result.email

Mas você também tem duas maneiras de corrigir isso.

Primeiro (é uma solução muito hackish, mas fácil), transforme seu sql para Arel , que vale para os escopos:
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"))

... e chame o método distinto AR:
Account.unverified_with_no_associations.select(:id, :email).distinct

Segundo (é uma solução muito melhor):

Não use sql diretamente. Reescreva seu escopo com Arel (https://github.com/rails/arel ) ou com squeel (https://github.com/activerecord-hackery/squeel )