【问题标题】:Rails first_or_create adds (1=2) to queryRails first_or_create 添加 (1=2) 到查询
【发布时间】:2013-06-01 00:04:57
【问题描述】:

在沙盒模式下通过 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

【问题讨论】:

  • “沙盒模式”是什么意思?
  • @NeilMiddleton 编辑 Q 以包含详细信息

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


【解决方案1】:

好的,谜团解开了。

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) 谓词。

我不能说我宁愿遇到错误:(

【讨论】:

  • 这个其实是here介绍的。它可以防止安全问题,即发送空哈希允许您进行 SQL 注入。这不是错误,它实际上是预期的行为。
  • 感谢您的信息 - 是否遵循特定的 Rails 哲学,这种方式是“静默失败”而不是抛出错误?
  • 这不是一个错误,而是一个特性。使用哈希查询允许您对字段指定一些相等性检查。空哈希自动返回不记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2013-03-04
  • 2015-07-10
  • 2015-01-27
相关资源
最近更新 更多