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

そして、これは私が呼び出したときに生成されたSQLですUserSession.authenticate('123345')

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

上記のように、スコープ ラムダからの条件を括弧で囲みます。これにより、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 に答える