Рельсы 3 + Скрепка: N + 1 Запрос - PullRequest
3 голосов
/ 10 апреля 2011

Итак, я использую гем Bullet, чтобы попытаться поймать N + 1 запросов в моем приложении Rails 3. Тем не менее, я нажал один запрос, который, кажется, не могу обойти.

Вот пулевое сообщение:

N+1 Query detected
  User => [:profile]
  Add to your finder: :include => [:profile]
N+1 Query method call stack
  .../app/models/user.rb:38:in `full_name'
  .../config/initializers/paperclip.rb:14:in `block in <top (required)>'
  .../app/views/photos/_photo_tiles.html.haml:4:in `_app_views_photos__photo_tiles_html_haml__787318603078146010_2192645460_1634077202131545355'
  .../app/views/photos/index.html.haml:30:in `_app_views_photos_index_html_haml___2562222078013468078_2155167020__3275303796392914006'

Хотя на самом деле не имеет смысла, почему он это делает, потому что у каждого пользователя всегда есть данные профиля, которые необходимо извлекать вместе с ними, поэтому моя модель User содержит это:

# SCOPES
default_scope includes(:profile)

# DELEGATES
delegate :first_name, :last_name, :full_name,
         :to => :profile

Итак, я всегда тяну профиль вместе с пользователем. Кажется, проблема связана с включением полного имени пользователя в имя файла для его загрузки, найденное в моем инициализаторе paperclip:

Paperclip.interpolates :username do |attachment, style|
  attachment.instance.user.full_name.dehumanize
end

Итак, этот вызов user.full_name передается user.profile, но профиль включен!

Итак, у кого-нибудь есть идеи, как устранить этот запрос N + 1?

Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2011

Вы уверены, что это истинный экземпляр запроса N + 1, а не ошибка Буллета?Может быть, это смущает вся вещь default_scope + делегат.

Вы пытались запустить рассматриваемый метод в script/console development, когда в другой оболочке выполняли tail -f log/development.log?

Таким образом, вы можете увидетькакие запросы выполняются и убедитесь, что Bullet не просто запутан.

...