2011-12-02 17 views
1

私はセッションストアとしてRails 2.3とActiveRecordを使用しています。セッションが必要になる前にセッションを作成しないようにしたいと思います。要求が終了する前にセッションを永続化する方法はありますか?

セッションに関連付けられたアイテムを格納するためのItensテーブルがあります。つまり、そのモデルにはアソシエートbelongs_to :sessionがあります。

新しいアイテムを作成する必要があるAjax呼び出しがあります。セッションがまだ存在しない場合は、アイテムに関連付けるセッションを作成する必要があります。 このためには、セッションテーブルのIDを必要としますが、セッションIDはCookieの識別に使用しません。 しかし、セッションレコードは、要求が完了した後でのみ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

http://markmail.org/message/4ilmpn7s3wkq6iodからパットマドックス) "Modelオブジェクトは、セッションについて何を知っているべきではありません"。

これは意味があります。セッションをメモリ、クッキー、ファイルシステムなどに保存することを決めた場合、モデルコードでは何も変更されないためです。

解決策は、items_groupsを格納する別のテーブルを作成することです。 セッションがまだ存在しない場合は、新しいitems_groupを作成し、そのIDをセッションに格納します。それ以外の場合は、セッションからitems_group_idを取得して完了です!

セッションがデータベースに格納されている場合は、これ以上問題はありません。

関連する問題