sql >> Databáze >  >> RDS >> PostgreSQL

Situace, kdy ActiveRecord a SQL nevrací stejné výsledky, protože neznámé OID je považováno za řetězec

Máte tento problém, protože ActiveRecord nemůže rozpoznat tento řádek jako řádek z tabulky vašeho účtu. AR neanalyzuje váš sql a není si jistý, co dělat s anonymními kortážemi.

Pokud používáte find_by_sql vaše vybrané atributy nejsou správně namapovány na váš model, ale jsou stále dostupné, takže zkuste:

result.id
result.email

Ale máte také dva způsoby, jak to opravit.

Za prvé (je to velmi hackerské, ale snadné řešení), transformujte svůj sql na Arel , které platí pro rozsahy:

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

... a zavolejte AR odlišnou metodu:

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

Za druhé (je to mnohem lepší řešení):

Nepoužívejte přímo sql. Přepište rozsah pomocí Arel (https://github.com/rails/arel ) nebo pomocí squeel (https://github.com/activerecord-hackery/squeel )




  1. Jak restartovat vzdálený server MySQL běžící na Ubuntu linux?

  2. Nelze se připojit k Postgresql na portu 5432

  3. Máte chybu v syntaxi SQL...?

  4. PostgreSQL:NOT IN versus EXCEPT rozdíl ve výkonu (upraveno #2)