Вопрос

Я использую Rails 2.3 и Activerecord в качестве сессионного магазина, и я хочу избежать создания сеансов, прежде чем это будет необходимо.

У меня есть таблица ITENS для хранения предметов, связанных с сеансом, то есть у ее модели есть ассоциация belongs_to :session.

У меня есть звонок Ajax, который должен создать новый элемент. Когда еще нет сеанса, он должен создать один, чтобы быть связанным с элементом. Для этого мне нужен удостоверение личности из таблицы сеансов, а не Session_id, используемый для идентификации Sesssion Cookie. Но запись сеанса создается только в БД после завершения запроса. Бывший:

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
Это было полезно?

Решение

«Объекты модели не должны ничего знать о сессии» (Пэт Мэддокс из http://markmail.org/message/4ilmpn7s3wkq6iod).

И это имеет смысл, так как, если я решил сохранить сеанс в памяти, файловых файлах, файловой системы или везде, в коде модели ничего не меняется.

Итак, решение состоит в том, чтобы создать другую таблицу для хранения items_groups. Если еще нет сеанса, создайте новый items_group и сохраните его идентификатор в сеансе. В противном случае, восстановите items_group_id из сеанса, и мы закончили!

Когда сеанс хранится в базе данных больше не имеет значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top