Результаты запроса Rails ORM

#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 запросов

Дополнительную ссылку можно найти по ссылке ниже

https://github.com/flyerhzm/bullet