sql >> Databasteknik >  >> RDS >> PostgreSQL

ActiveRecord:Hur hittar man föräldrar vars ALLA barn matchar ett tillstånd?

Använder arel kan ta dig ganska långt. Den knepiga delen är hur du inte skriver hela din fråga med arel s egen frågesyntax?

Här är ett knep:när du bygger din fråga med where , om du använder arel villkor får du några extra metoder gratis. Du kan till exempel anpassa underfrågan du har där med .exists.not , vilket ger dig en (NOT ( EXISTS (subquery))) Kasta det till förälderns where -klausul och du är klar.

Frågan är hur man refererar till de inblandade tabellerna? Du behöver Arel för det. Du kunde använd Arels where med dess fula förhållanden som a.eq b . Men varför? Eftersom det är ett jämställdhetsvillkor kan du använda Rails villkor istället! Du kan referera till tabellen du frågar med en hash-nyckel, men för den andra tabellen (i den yttre frågan) kan du använda dess arel_table . Titta på det här:

parents = Parent.arel_table
Parent.where(
  Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
)

Du kan till och med minska Arel-användningen genom att använda strängar lite och lita på att du kan mata in underfrågor som parametrar till Rails where . Det finns inte så mycket nytta av det, men det tvingar dig inte att gräva för mycket i Arels metoder, så du kan använda det tricket eller andra SQL-operatorer som tar en underfråga (finns det till och med några andra?):

parents = Parent.arel_table
Parent.where('NOT EXISTS (?)',
  Child.where(parent_id: parents[:id], other_parent_id: nil)
)

De två huvudpunkterna här är:

  • Du kan bygga underfrågor precis på samma sätt som du är van vid att bygga vanliga frågor, med hänvisning till den yttre frågans tabell med Arel. Det kanske inte ens är ett riktigt bord, det kan vara ett alias! Galna grejer.
  • Du kan använda underfrågor som parametrar för Rails where metoden helt okej.


  1. Problem med att komma åt en förmodat inaktiverad funktion i CODEIGNITER

  2. Vilka är de bästa tillgängliga dataåtkomstalternativen för Play Framework med Scala och PostgreSQL?

  3. php hur man använde valrutan för sökdata i listvyn (tabell)

  4. SQL Server-avrundningsfel, ger olika värden