Rails first_or_create将(1 = 2)添加到查询中

时间:2013-06-05 10:21:29

标签: sql ruby-on-rails postgresql activerecord heroku

在沙箱模式下通过Heroku控制台运行开发代码时,我使用first_or_create来测试是否存在记录:

Right.where(:language           => language          ).
      where(:work_id            => work_id           ).
      where(:contact_id         => contact_id        ).
      first_or_create!

测试记录是否存在的查询会添加一个额外的谓词(1 = 2),因此找不到记录。

SELECT "rights".* FROM "rights" WHERE "rights"."language" = 'ger' AND "rights"."work_id" = 625 AND "rights"."contact_id" = 1435 AND (1 = 2) LIMIT 1

任何人都可以建议我如何追踪这个来源 - 这可能是一个沙箱模式的事情吗?

编辑:沙盘模式由以下方式调用:

heroku run console -s --app my-app-name

Running Rails console on heroku, in sandbox mode

1 个答案:

答案 0 :(得分:2)

好的,神秘的解决了。

first_or_create是从一个为多个属性传递参数的方法调用的。类似的东西:

def get_right(language,work_id,contact_id,terms)
  right = Right.where(:language           => language          ).
                where(:work_id            => work_id           ).
                where(:terms              => terms             ).
                where(:contact_id         => contact_id        ).
                first_or_create!
  right.id
end

当调用该方法时,terms参数被传递为{}而不是nil。

显然,activerecord处理这种愚蠢的方法是删除查询中违规列(术语)的谓词,并附加一个(1 = 2)谓词。

我不能说我不会遇到错误:(