我一直在rails控制台中试图让事情发挥作用,并且我一直注意到我的一个查询在不应该返回时返回nil。在查看生成的SQL查询时,我注意到每次都附加了AND (1=0)
。这有点烦人,我不知道为什么要这样做。
注意:使用actable gem。
重现的步骤:
(连接到rails控制台中的表后)
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 []>
为什么会这样?我如何让它停止?
答案 0 :(得分:45)
当您查询其值为空数组的列时,Rails将生成类似AND (1=0)
的SQL:
Child.where(id: [])
直观地说,您希望生成类似SELECT * FROM children WHERE id IN ()
的SQL,但()
实际上并不是有效的SQL。但是,由于没有行会匹配该查询,因此Rails通过生成同样不返回任何行的等效查询来解决此问题:
SELECT * FROM children WHERE 1=0;