类似$或@@变量的东西,但每个用户会话都是唯一的。轨道

时间:2011-10-31 12:21:35

标签: ruby-on-rails ruby-on-rails-3.1

我有一些对象。出于性能原因,我无法将其存储在DB中。我在Global($ var)和Class(@@ var)变量(在控制器中)中尝试了存储数组,但它对于所有用户来说都是相同的数组。它应该对每个用户会话都是唯一的,并且在每个会话中都应该能够快速修改。

我理解会话[] - 不是最佳解决方案。什么是最好的方式?

在控制器中执行操作时,我每次都会执行类似$lines_rules << Processing::rule_creator(...)的操作。

$ lines_rules - 这是我的对象数组。

为什么DB不适合商店$ lines_rules?在$ lines_rules中,我使用lambda函数存储对象。当用户按下按钮时,我需要用用户输入调用每个lambda函数并保持结果。然后我将新对象加载到$ lines_rules中。因此,每个请求都会更改$ lines_rules。我认为使用记忆是更好的表现方式。

更新

我使用$global_hash [ session[:session_id] ]和这种技术来节省资源:

def dead_sessions_killer
  ActiveRecord::SessionStore::Session.where(["updated_at < ?", 30.minutes.ago]).each do |session|
    $global_hash.delete_if {|key, value| key == session.session_id }
    session.delete
  end
end

3 个答案:

答案 0 :(得分:1)

使用全局但全局的哈希,用户的会话ID键入。

在那里存储你想要的任何东西,虽然有适当的缓存,很难说这是不是一个好主意。

答案 1 :(得分:0)

您可以将数组声明为类变量(仅1个@符号),并提供访问器方法。

那是:

class Foo

  @some_array

  def some_array
    @some_array
  end

end

从其他类中,这可以让您调用foo_instance.some_array,这会使数组保持特定于用户,但允许来自任何类的公共访问。

答案 2 :(得分:0)

您可以使用memcache将用户会话存储在内存中。这将是方便和快速的。

http://awesomerails.wordpress.com/2011/08/23/rails-3-memcached-session-store/