1

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

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

我有一个应该创建一个新项目的 Ajax 调用。当还没有会话时,它应该创建一个与项目关联的会话。为此,我需要会话表中的 id,而不是用于识别 cookie 会话的 session_id。但是,会话记录仅在请求完成后才在数据库中创建。前任:

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
4

1 回答 1

0

“模型对象不应该对会话一无所知”(来自http://markmail.org/message/4ilmpn7s3wkq6iod的 Pat Maddox )。

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

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

会话何时存储在数据库中不再重要。

于 2011-12-06T11:51:38.970 回答