sql >> Database >  >> RDS >> PostgreSQL

Een situatie waarin ActiveRecord en SQL niet dezelfde resultaten retourneren omdat onbekende OID wordt behandeld als String

Je hebt dit probleem omdat ActiveRecord deze rij niet kan herkennen als rij uit je accounttabel. AR ontleedt je sql niet en het weet niet wat te doen met anonieme cortage.

Als u find_by_sql . gebruikt uw geselecteerde kenmerken zijn niet correct toegewezen aan uw model, maar zijn nog steeds toegankelijk, dus probeer:

result.id
result.email

Maar je hebt ook twee manieren om dat op te lossen.

Eerste (het is een erg hackachtige maar makkelijke oplossing), transformeer je sql naar Arel , die geldig zijn voor de scopes:

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

... en roep AR afzonderlijke methode aan:

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

Tweede (het is een veel betere oplossing):

Gebruik sql niet rechtstreeks. Herschrijf uw bereik met Arel (https://github.com/rails/arel ) of met squeel (https://github.com/activerecord-hackery/squeel )




  1. Hergebruik MySQL-verbinding PHP-objectovererving

  2. Entity Framework-queryprestaties verschillen extreem met onbewerkte SQL-uitvoering

  3. Een verhaal van twee clusterfactoren

  4. MySQL voegt geen backslash in