我使用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
答案 0 :(得分:0)
“模型对象不应该对会话有任何了解”(来自http://markmail.org/message/4ilmpn7s3wkq6iod的Pat Maddox)。
这是有道理的,因为如果我决定将会话存储在内存,cookie,文件系统或任何地方,那么模型代码中没有任何改变。
因此,解决方案是创建另一个表来存储items_groups。 如果还没有会话,请创建一个新的items_group并将其ID存储在会话中。否则,从会话中检索items_group_id,我们就完成了!
当会话存储在数据库中时无所谓。