【问题标题】:Fix deprecation warning: where() with self referencing SQL, but also uses includes()修复弃用警告:带有自引用 SQL 的 where(),但也使用 include()
【发布时间】:2016-02-01 17:19:54
【问题描述】:

我正在将一个项目从 Rails 3.2 升级到 Rails 4.0,并且我正在尝试解决一个导致弃用警告的问题。警告是由这样的查询引起的:

email = Email.
  includes(:person).
  where("lower(email) = ? ", login_email.downcase).
  first

这里的“emails”表有一个字符串列“email”,其中包含电子邮件地址。

弃用警告是 Rails 4 的警告,它说由于我使用带有 SQL 字符串的 where() 并且我使用 include() 进行急切加载,我应该使用 references() 来完成正确的加入工作,这样 Rails 就不必解析 SQL 来找出连接。在这种情况下,我使用的 SQL 引用了我从中查询的模型,而不是关联,因此 SQL 不涉及连接。为了消除警告,我很想做以下废话,说连接引用是查询模型:

email = Email.
  includes(:person).
  where("lower(email) = ? ", login_email.downcase).
  references(:emails).
  first

但这不会使弃用警告静音。

问题简而言之:我用 SQL 调用 where() 引用了我从中查询的模型,我正在使用 include() 从与上述 SQL 无关的表中预加载数据,但我我被要求在不适用的情况下使用 references()。

关于如何解决在这种情况下导致弃用警告的问题的任何提示?警告本身提供的提示在这里并不适用。

干杯, 克里斯

【问题讨论】:

  • 也许限定列名 (lower(emails.email)) ?

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


【解决方案1】:

您可以关闭每个环境的弃用警告...但我不建议这样做(尤其是在开发/测试中,它们是有用的警告)。

看看this discussion 看看替代品。否则,我建议修复弃用警告(使用新语法)并避免忽略弃用。

【讨论】:

  • 感谢 daino3。我肯定更愿意解决这个问题而不是让警告静音,我应该修改我的问题以反映这一点。
  • 好的,你能不能试试Email.includes(:person).where("lower(emails.email) = ?", login_email.downcase).first...如果这不起作用,请加入你references(:emails)。我认为 SQL 字符串认为 email 列在两个表中不明确。
  • 再次感谢 daino3。不幸的是,您的建议并不能阻止弃用警告。通过在调用链中添加“.joins(:person)”,我找到了一种使警告静音的方法。这对我来说有点麻烦,因为虽然在这种情况下这样做是良性的,但它并不是普遍适用的,我这样做只是为了消除警告。
  • 是的,这确实看起来有点笨拙。但是哦,好吧:/。很高兴你想通了并且很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
相关资源
最近更新 更多