如何在请求结束前在Rails中持久化会话?

时间:2011-12-02 23:07:41

标签: ruby-on-rails session activerecord session-store

我使用Rails 2.3和ActiveRecord作为会话存储,我想避免在需要之前创建会话。

我有一个Itens表来存储与会话相关联的项目,即其模型具有关联belongs_to :session

我有一个Ajax调用应该创建一个新项目。当还没有会话时,它应该创建一个与该项目相关联的会话。 为此,我需要来自sessions表的id,而不是用于通过cookie识别sesssion的session_id。 但是,会话记录仅在请求完成后在DB中创建。 例如:

def create
  request.session_options[:id] # nil if there is no session yet
  session[:activate] = 1 # this "creates" the sesssion (but not in DB)
  request.session_options[:id] # now the new generated session_id
  db_session = Session.find_by_session_id(request.session_options[:id]) # nil, not in DB yet :(
  Item.new(
    :session_id => db_session.id, # ops, id called for nil object
    :data => params[:data]
  )
end

1 个答案:

答案 0 :(得分:0)

“模型对象不应该对会话有任何了解”(来自http://markmail.org/message/4ilmpn7s3wkq6iod的Pat Maddox)。

这是有道理的,因为如果我决定将会话存储在内存,cookie,文件系统或任何地方,那么模型代码中没有任何改变。

因此,解决方案是创建另一个表来存储items_groups。 如果还没有会话,请创建一个新的items_group并将其ID存储在会话中。否则,从会话中检索items_group_id,我们就完成了!

当会话存储在数据库中时无所谓。