Rails минимизирует нагрузку на базу данных - PullRequest
2 голосов
/ 31 августа 2011

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

Вот примерточка.У меня назначена модель, которая принадлежит пользователю.В своем синтаксисе я иногда могу сказать process_user @appointment.user. Когда я пишу это, запускается ли отдельный запрос SELECT к базе данных для извлечения этого пользователя? Более эффективно написать process_user @appointment.user_id, где user_id - это атрибут в встрече, а затем попытаться использовать значение user_idчтобы выполнять свои задачи, связанные с оценкой, пока мне не нужен весь объект пользователя @appointment.user.

Честно говоря, с точки зрения душевного спокойствия, я просто люблю иметь возможность использовать process_user @appointment.userпотому что он читается лучше, выглядит лучше и лучше работает при подготовке логики.Это эффективный способ?

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Вы прекрасно справляетесь с использованием кода, подобного process_user @appointment.user, так как ActiveRecord старается минимизировать количество запросов к базе данных. Конечно, он не справляется со всеми ситуациями идеально, но ваш пример очень простой. Вероятно, немедленного запроса к базе данных не произойдет, и объект будет загружен только при обращении к его атрибутам.

Если вы замечаете проблемы с производительностью в запущенном крупномасштабном приложении и можете отслеживать проблемы вплоть до ActiveRecord с помощью профилирования, возможно, пришло время оптимизировать. Попытка предварительной оптимизации с самого начала противоречила бы философии Rails и приводила только к уродливому (и, возможно, даже более медленному) коду. Помните, что узкие места в реальной производительности часто бывают там, где вы их никогда не ожидаете.

РЕДАКТИРОВАТЬ: Как указала Winfield, оптимизация количества запросов обычно не означает самостоятельного управления внешними ключами или аналогичными внутренними объектами. Существует множество флагов и опций для методов доступа к БД, которые позволяют вам контролировать запросы к вашей базе данных.

1 голос
/ 01 сентября 2011

Вы можете охотно загружать связанных пользователей с вашими моделями Назначений:

Appointment.all(:include => :user)

... который присоединится к пользователям или выполнит отдельный поиск для всех связанных пользователей в одном запросе.

Это затем загрузит пользовательскую ассоциацию заранее (с нетерпением), так что атрибут пользователя уже заполнен объектом, когда вы ссылаетесь на него, вместо того, чтобы останавливаться и выполнять отдельный запрос, чтобы искать его один за другим (N + 1 запрос).

...