Rails: удаление ненужных запросов к базе данных - PullRequest
0 голосов
/ 26 августа 2009

Скажем, у меня есть модель поста и категории, где каждый пост принадлежит категории. Почти на каждой странице я получаю список категорий:

@categories = Category.all

Это создает массив объектов Category. Теперь скажите, что у каждой категории есть атрибуты id и name. При просмотре сообщения я хочу отобразить название категории.

Я изначально получал название категории, делая что-то вроде этого:

@post = Post.find(params[:id], :include => :category)

Однако я понимаю, что у меня уже есть массив @categories. Кажется ненужным: включать, когда у меня уже есть список категорий. Поэтому вместо этого я выполняю поиск по массиву:

category = @categories.find { |category| @post.category_id == category.id }.name

Это работает и уменьшает количество запросов. У меня вопрос, если это лучший способ сократить количество запросов (без кэширования)?

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Это совершенно разумно.

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

ИМО, это очень маленькая цена.

1 голос
/ 26 августа 2009

Единственная проблема здесь - когда вы решите, что список категорий вам больше не нужен, и попытаетесь удалить его.

В противном случае вы получите хорошее решение.

0 голосов
/ 26 августа 2009

А что если у вас большое количество категорий? Ты все еще собираешься забрать их всех? Выполнение :include намного лучше, так как SQL всегда побеждает Ruby.

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