【问题标题】:Why is Rails wrapping my scoped arguments in parentheses?为什么 Rails 将我的作用域参数包装在括号中?
【发布时间】:2013-11-05 12:25:45
【问题描述】:

我正在为我的应用程序创建一个 UserSession 模型,其范围为 active 用于上周活动的会话。

一切正常,直到我在登录后尝试使用该应用程序 - 我能够登录并创建一个会话,并且它能够通过 user_id 找到我的用户。但是,Rails 正在生成不返回任何会话的 SQL,因此我实际上无法使用该应用程序。

这是模型的相关代码:

scope :active, -> { where('accessed_at >= ?', 2.weeks.ago) 

def self.authenticate(key)
    self.active.find_by(key: key)
end

这是我调用UserSession.authenticate('123345')时生成的SQL

SELECT  `user_sessions`.* FROM `user_sessions`  WHERE `user_sessions`.`key` = '123345' AND (accessed_at >= '2013-10-12 10:50:52') LIMIT 1

如上所示,它将范围 lambda 中的条件包装在括号中,这使得 SQL 有效但不返回必要的数据。有什么方法可以使scope 不带括号?

【问题讨论】:

  • 去掉括号会有什么不同...去掉括号会给你想要的数据??
  • 你想到了什么括号?我可以在 SQL 中看到 one 对括号,它们对语义有 zero 影响。

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


【解决方案1】:

生成的 SQL 在语义上是正确的。为了确保正确的执行顺序,Rails 将每个级别的范围包装在自己的一组括号中。

执行时以下没有区别:

SELECT  `user_sessions`.* FROM `user_sessions` WHERE `user_sessions`.`key` = '123345' AND (accessed_at >= '2013-10-12 10:50:52') LIMIT 1

SELECT  `user_sessions`.* FROM `user_sessions`  WHERE `user_sessions`.`key` = '123345' AND accessed_at >= '2013-10-12 10:50:52' LIMIT 1

您确定有满足该查询的记录吗?

【讨论】:

  • 该死,在我更深入地查看它之后,它实际上是在每次更新时更改会话令牌,因为我设置了一个before_validation 过滤器来生成一个新令牌。你是完全正确的,它没有找到有效的记录。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-04
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
相关资源
最近更新 更多