ActiveRecord将'AND(1 = 0)'附加到查询结尾

时间:2014-09-12 21:04:02

标签: mysql ruby-on-rails activerecord ruby-on-rails-4 rails-console

我一直在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 []>

为什么会这样?我如何让它停止?

1 个答案:

答案 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;