更新:全部,感谢您的回复 - 这里有一些更重要的信息。
我正在使用Neo4J图形数据库作为后端,ROR 3(MRI)和一个通过REST访问的单个Neo4J数据库服务器。
如果您对Neo4j了解不多,使用多个数据库服务器(主/主)的数据成本为26,000美元,这意味着我现在必须编写优化代码,而不是更晚,或者提出26,000美元。 ..我敢肯定你可以猜到我要用这个方式......我通过休息而不是本地等方式使用它,所以表现很重要......
我有一个数据库服务器,它必须处理所有数据库工作,并且在这种情况下,1 ms计数,其中一些其他查询最多需要40 ms。所以不,我不想不必要地访问数据库,因为它只会添加不必要的工作。
可能很容易说“不要编码你还没有的优化或问题”,但是考虑到了瓶颈和高昂的成本 - 事实上我已经拥有了我需要做的事情,除了认证部分,它真的不适用。
我只想知道,如果@current_user || =跨页有效..答案是它在请求中有效,而不是跨越它们或页面。是的,这是一个简单的问题,但有时候他们必须在R& D和高级东西中被问到。因此,我坚持使用会话来保持用户登录的ID。
感谢您的帮助!
我正在尝试允许用户通过Cookie或用户名和密码登录我的网站。用户名/密码部分工作正常,但在引入cookie时遇到问题....
我已经准备好了很多“如何”,包括:http://ruby.railstutorial.org/chapters/sign-in-sign-out
我不想使用宝石,设计等。
问题:
我注意到页面中读取current_user(应用程序控制器中的帮助程序)的请求导致数据库读取,即使我正在使用|| = ..
我已经尝试了@current_user || = User.find by blah blah blah
并且它总是击中数据库。这不应该是这样吗?它应该打一次然后就是这样,对吗?
但是在你建议任何教程之前 - 我已经看过很多教程 - 这是我的问题..是@current_user在页面中保存,还是仅仅针对当前页面?上面的链接提到它只保存当前页面...
你看,我不想不必要地找到同一个人以前登录的数据库。我可以用会话变量来做。
我真的只是想检查一个cookie,并且很乐意继续使用session [:user_id] ......出于性能原因,我不想继续访问数据库。
任何帮助?
我的新代码如下(在这种情况下,这也总是会击中数据库)。我删除了典型的@current_user || = find_by ..因为它没用 - 它总是命中数据库。
..我已经尝试了https://github.com/cliftonm/basic-auth和http://ruby.railstutorial.org/chapters/sign-in-sign-out等等。
(ROR 3.2 ......)
class ApplicationController < ActionController::Base
protect_from_forgery
#before_filter :set_var
helper_method :current_user
private
def current_user
@current_user = User.find_by_id(session[:user_id]) #if session[:user_id]
if (@current_user)
return @current_user
end
@current_user =User.find_by_remember_token(cookies[:auth_token]) if cookies[:auth_token]
if (@current_user)
return @current_user
end
end
答案 0 :(得分:4)
User.find
将始终访问数据库。 Rails.cache
可以通过多种方式进行配置,但如果需要这种方式,则最受欢迎的是Memcached。
除非您处理大量扩展问题,否则获取用户记录所需的时间应少于1毫秒,因此几乎不值得大惊小怪。检查您的log/development.log
以查看各种查询的执行时间,并首先关注最慢的查询。
@current_user
等实例变量在请求期间仅持续 。请记住,HTTP协议是无状态的,每个请求都独立于其他请求,并且通信状态的唯一方法是通过cookie,像数据库这样的持久存储,像内存缓存这样的临时存储,或者通过以下方式发送的参数。请求本身通过GET或POST。
如果您想跨页面保存某些内容,请将其添加到session
,但要小心。你应该只坚持像字符串,数字或布尔值这样的东西。你不应该添加模型。此外,使用默认cookie存储,您在会话中放置的每个内容都会增加从该点开始向您的应用程序发出的所有请求的开销,直到您从session
商店中删除它为止。 / p>
在你解决所有其他问题之前,不要让小东西流汗。业务逻辑第一,优化第二。
答案 1 :(得分:0)
这些都不应该每次都关闭数据库。请告诉我。
if (@current_user)
@current_user
else
@current_user = User.find_by_id(session[:user_id])
end
或
@current_user ||= User.find_by(id: session[:user_id])
答案 2 :(得分:-1)
您是否尝试过使用before_filter(而不是帮助程序)只加载current_user一次?然后,您将使用实例变量存储/访问它。
class ApplicationController < ActionController::Base
before_filter :load_current_user
def load_current_user
@current_user = # your code goes here.
end
end
编辑:
我的坏。如何在cookie中存储服务器端加密的current_user记录,并将哈希值保留在会话中以供以后检查?