PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Una situazione in cui ActiveRecord e SQL non restituiscono gli stessi risultati a causa dell'OID sconosciuto trattato come String

Hai riscontrato questo problema perché ActiveRecord non è in grado di riconoscere questa riga come riga dalla tabella dell'account. AR non analizza il tuo sql e non è sicuro di cosa fare con il cortage anonimo.

Se usi find_by_sql gli attributi selezionati non sono stati mappati correttamente sul modello ma sono comunque accessibili, quindi prova:

result.id
result.email

Ma hai anche due modi per risolverlo.

Prima (è una soluzione molto hackish ma facile), trasforma il tuo sql in Arel , valido per gli ambiti:

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 chiama il metodo AR distinto:

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

Secondo (è una soluzione molto migliore):

Non utilizzare sql direttamente. Riscrivi il tuo ambito con Arel (https://github.com/rails/arel ) o con squeel (https://github.com/activerecord-hackery/squeel )