2

我正在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

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

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不带括号的?

4

1 回答 1

2

生成的 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

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

于 2013-10-26T11:15:03.557 回答