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

011*_*112 24 mysql activerecord ruby-on-rails rails-console ruby-on-rails-4

我一直在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 []>
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我怎么让它停下来?

Max*_*iel 48

AND (1=0)当您查询其值为空数组的列时,Rails将生成SQL :

Child.where(id: [])
Run Code Online (Sandbox Code Playgroud)

直观地说,您希望生成类似SQL SELECT * FROM children WHERE id IN (),但()实际上并不是有效的SQL.但是,由于没有行会匹配该查询,因此Rails通过生成同样不返回任何行的等效查询来解决此问题:

SELECT * FROM children WHERE 1=0;
Run Code Online (Sandbox Code Playgroud)