17

İşe yaramaya çalışan raylar konsolunda oynuyorum, ve sorgularımdan birinin ne zaman geldiği zaman geri dönmeyi sürdürdüğünü fark ediyorum. t. Oluşturulan SQL sorgusuna baktığımda, her seferinde eklenmiş olan AND (1=0) olduğunu fark ettim. Bu biraz sinir bozucu ve neden bunu yaptığından emin değilim.ActiveRecord, 'AND (1 = 0)' sorgusunun sonuna ekliyor

Not: Dökülebilir geminin kullanılması.

Yeniden oluşturma adımları:

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 []> 

neden oluyor (raylar konsolda tablolar bağlandıktan sonra)? Nasıl durdurabilirim? Eğer, değeri boş bir dizide bir sütun için sorguladığınızda

+1

Ben Raylar bu sorgu için bunu yapar fark: 'User.where (: id => []) ', SQL SELECT * FROM kullanıcılarının NEREDE()' de yazamayacağından. Bu yüzden, bu yaklaşımın hiçbir şeyin geri dönmeyeceğini bildiği sorgular için gerekli olduğunu düşünüyorum, ancak SQL'de ifade edemez. – MaxGabriel

+0

@MaxGabriel bu benim için cevaptı. Belki bunu sadece yorum yapmak yerine bir cevap olarak yorumlayabilir miyiz? – jgraft

+0

@jgraft İyi fikir, önerdiğin gibi bir cevap verdim. – MaxGabriel

cevap

35

Raylar AND (1=0) gibi SQL oluşturur: Sezgisel

Child.where(id: []) 

, bunu SELECT * FROM children WHERE id IN() gibi SQL oluşturmak için bekleyebilirsiniz fakat () değil aslında geçerli SQL hiçbir satır bu sorguyu maç olacak yana olsa da, Raylar da hiçbir satır döndürür eşdeğer sorguyu üreterek bu sorunu çalışır:

SELECT * FROM children WHERE 1=0; 
+0

Teşekkürler! Bu cevap bana aynı karışıklıkla yardımcı oldu! Çok kötü, asla doğru cevap olarak kabul edilmedi. – ChrisDekker

+0

@ alex0112 Bu cevabı kabul etmeyi düşünür müsünüz? – MaxGabriel

+0

Ayrıca, boş sağlama belirtileri Child.joins (: parent) .follow (: parent => {}) – olivervbk