2009-08-25 3 views
0

Скажем, у меня есть модель должности и категории, причем каждое сообщение относится к категории. На почти каждой странице я получаю список категорий:Rails: Удаление ненужных запросов к базе данных

@categories = Category.all 

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

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

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

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

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

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

ответ

2

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

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

ИМО, это ужасно маленькая цена для оплаты.

+0

хорошо пункт. UNF. ни один голос не оставил :) –

1

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

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

0

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

+0

Я только предвижу максимум ... 20 категорий. Мне всегда нужно получать эти категории. – Homar

Смежные вопросы