#ruby-on-rails #database #ruby-on-rails-4
#ruby-on-rails #База данных #ruby-on-rails-4
Вопрос:
Почему платформа Ruby on Rails не предоставляет метод, позволяющий понять, вызовет ли выполняемая мной операция запрос или нет?
Возьмите пользователя, у которого много сообщений
на мой взгляд, я сделаю:
<% @user.posts.each do |p| %>
<%= p.title %>
<% end %>
У меня нет способа узнать, сделал ли я в своем контроллере
@user = User.find(params[:id]).includes(:posts)
это быстрая загрузка и вызывает один запрос с левым соединением, или если бы я это сделал:
@user = User.find(params[:id])
это вызывает n 1 запросов
Если приложение простое, проблем не возникнет, но давайте возьмем приложение большего размера. Возможно, метод запроса находится не в контроллере, а в модели. И, возможно, это даже не в модели, а в проблеме (внешний модуль, включенный в мою модель).
другими словами, у меня создается впечатление, что я теряю контроль над тем, что фреймворк делает с моей базой данных.
Вы нашли какие-либо решения этой проблемы?
Комментарии:
1. Вы можете добавить bullet gem в свое приложение, которое будет запрашивать n 1 запросов
2. На самом деле,
includes
вызывает не один запрос с левым соединением, а два запроса. guides.rubyonrails.org /…3. Также вы можете использовать этот драгоценный камень, чтобы помочь вам: github.com/flyerhzm/bullet
4. Я знаю bullet gem, но этого недостаточно. Мне не нужна диагностика, мне нужен структурированный метод работы. Что-то вроде «поместите все результаты запроса в массив, чтобы я не мог прозрачно вызывать базу данных». Framweork должен предоставлять методы для решения очень распространенных проблем, и я не могу поверить, что это не распространенная проблема.
Ответ №1:
Вы можете добавить bullet gem в свое приложение, которое будет запрашивать n 1 запросов
Добавьте этот драгоценный камень в свое приложение
gem "bullet", :group => "development"
Добавьте следующие настройки в свой конфигурационный файл config/environments/development.rb
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.bullet_logger = true
end
После этого вы должны иметь возможность отслеживать n 1 запросов
Дополнительную ссылку можно найти по ссылке ниже