Это правильное дизайнерское решение?Есть ли способ лучше? - PullRequest
1 голос
/ 22 марта 2012

Итак, ради производительности я использую сеансы базы данных. Я полагаю, что хотя сеансы находятся на стороне сервера, я мог бы также хранить общедоступные объекты в сеансе. Итак, я храню сериализованные версии current_user, current_account и полномочий current_user.

Модель User управляет многими методами разрешений (такими как user.can_do_whwhat), но так как я пытаюсь быть более эффективным и хранить общедоступные вещи в сеансе (это позволяет гораздо меньше обращений к БД), имеет ли смысл / нарушать какие-либо стандарты проектирования (при каждом запросе) сохранять сеанс в переменной экземпляра в current_user?

На данный момент я не могу придумать альтернатив.

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

ROR-приложения по умолчанию имеют дизайн RESTful.Одно из правил REST - безгражданство.это означает, что каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для понимания запроса, и не может использовать какой-либо сохраненный контекст на сервере.

Если у вас проблемы с производительностью базы данных, используйте систему кешакак memcached , который уже интегрирован в rails (Caching with Rails) .

1 голос
/ 22 марта 2012

Я обнаружил пару из ссылок , предупреждающих против хранения непримитивных типов данных в сеансе, но все они были просто предупреждениями и сводились к: Хранение сложных объектов - это " Особенно обескуражен "[sic], но если вы решите, что вам нужно ... ну, просто будьте осторожны.

Во всяком случае, я вроде как согласился с мыслью о том, чтобы таблица пользователей была удвоена по сравнению с таблицей сеансов, но сериализация все еще кажется немного отрывочной. Если вы просто пытаетесь сократить количество запросов к БД, как насчет хранения идентификаторов и использования :joins при поиске вашего пользователя (может потребоваться немного хакеров, чтобы это сработало при загрузке сеанса по умолчанию). Это позволяет избежать проблем синхронизации и схематичности сериализации, и при этом генерирует только один запрос к БД. Просто убедитесь, что вы используете :joins, а не :include, так как последний генерирует запрос для каждой таблицы .

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...