17

Ho giocato alla console di rails cercando di far funzionare le cose, e continuo a notare che una delle mie query continua a tornare nil quando non dovrebbe t. Osservando la query SQL generata, noto che ha aggiunto AND (1=0) ogni volta. Questo è un po 'fastidioso, e non sono sicuro del perché lo stia facendo.ActiveRecord aggiunge 'AND (1 = 0)' alla fine delle query

Nota: Utilizzo della gemma attiva.

Procedura per riprodurre:

(Dopo il collegamento a tavoli in console rotaie)

2.1.2 :xxxx > @parent = Parent.take 
Parent Load (38.1ms) SELECT `parents`.* FROM `parents` LIMIT 1 
=> #<Parent id: 37, ...> 

2.1.2 :xxxx > @child = Child.where(id: @parent.actable_id) 
SQL (0.7ms) SELECT `childs`.`id` AS t0_r0, `childs`.`attribute` AS t0_r1, FROM `childs` 
... 
LEFT OUTER JOIN `parents` ON `parents`.`actable_id` = `childs`.`id` AND `parents`.`actable_type` = 'child type' WHERE `childs`.`id` = 20 AND (1=0) 
=> #<ActiveRecord::Relation []> 

perché sta succedendo questo? Come faccio a smettere?

+1

Ho notato che Rails esegue questa operazione per questa query: 'User.where (: id => []) ', dato che non puoi scrivere' SELECT * FROM users WHERE id in() 'in SQL. Quindi immagino che questo è l'approccio necessario per le query che sa non restituirà nulla, ma non può esprimere in SQL. – MaxGabriel

+0

@MaxGabriel questa è stata la risposta per me. Forse metterlo come risposta invece di un semplice commento? – jgraft

+0

@jgraft Buona idea, ho fatto questa risposta come mi hai suggerito. – MaxGabriel

risposta

35

Rails si generano SQL come AND (1=0) quando si esegue una query per una colonna il cui valore è in un array vuoto:

Child.where(id: []) 

Intuitivamente, ci si aspetterebbe che per generare SQL come SELECT * FROM children WHERE id IN(), ma in realtà non è () SQL valido. Poiché nessuna riga corrisponde alla query, Rails aggira questo problema generando una query equivalente che non restituisce alcuna riga:

SELECT * FROM children WHERE 1=0; 
+0

Grazie! Questa risposta mi ha aiutato con la stessa confusione! Peccato che non sia mai stata accettata come risposta corretta. – ChrisDekker

+0

@ alex0112 Prenderesti in considerazione l'accettazione di questa risposta? – MaxGabriel

+0

Questo sembra accadere anche se si specificano gli hash vuoti Child.joins (: parent) .where (: parents => {}) – olivervbk