session
переменные живут в течение сеанса браузера. Таким образом, эта ошибка означает, что вы удалили записи базы данных при входе в систему и не настроили session[:private_conversations]
соответствующим образом.
Вам нужно либо удалить удаленные идентификаторы из session[:private_conversations]
, либо настроить поиск, чтобы он был в порядке, только не найдя их.
Я бы изменил ваш код на это:
def opened_conversations_windows
if user_signed_in? && session[:private_conversations].present?
@private_conversations_windows = Private::Conversation.includes(:recipient, :messages)
.where(id: session[:private_conversations])
# Update the session variable to only have the existing values
session[:private_conversations] = @private_conversations_windows.map(&:id)
else
@private_conversations_windows = []
end
end
Обратите внимание, что я превратил find()
в where(id: )
. find
ожидает, что все предоставленные идентификаторы будут существовать. where
не требует никаких записей для возврата; он просто ищет, и вы получаете то, что получаете.
Кроме того, он выполняет запрос к базе данных только тогда, когда у пользователя фактически открыты личные беседы. Это важно, потому что в противном случае он выполнил бы неправильный запрос, если вы вошли в систему, но у вас не было личных разговоров. (WHERE id IS NULL
или что-то в этом роде)
Наконец, у меня есть небольшая очистка переменной сеанса, чтобы установить только те, которые еще существуют в базе данных.
Теперь позже, когда вы установите session[:private_conversations]
, (предположительно, когда кто-то закрывает / открывает новый разговор), вы можете установить для него только те, которые еще существуют.
Вы упоминаете, что, похоже, сработало:
if (user_signed_in? && @private_conversations_windows)
Учитывая код, который вы разместили, я полагаю, что на самом деле вы никогда не установите @private_conversations_windows
на что-либо другое, кроме []
. Причина в том, что вы сейчас пытаетесь установить эту переменную, поэтому в настоящий момент она должна быть равна нулю. Поскольку он всегда равен нулю, вы никогда не попадете на сторону if
, который фактически запрашивает базу данных. Конечно, это больше не будет ошибкой, но это потому, что он больше не делает ничего полезного. В основном это будет эквивалентно:
def opened_conversations_windows
@private_conversations_windows = []
end