Области применения
Прежде всего, вы должны переместить многие из них в scopes
, что позволит вам использовать их гораздо более гибкими способами, такими как цепочка запросов с использованием ActiveRecord. Смотри http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html.
Индексы
Во-вторых, если вы все равно выполняете все эти запросы, убедитесь, что index ваша база данных, например, быстро найдет Status
по имени. Пример миграции для выполнения первого индекса:
add_index :status (or the name of your Status controller), :name
Session
Если данные, которые вам здесь нужны, не являются критичными, то есть вам не нужно полагаться на них для дальнейших расчетов или обновлений базы данных, вы можете рассмотреть возможность сохранения некоторых из этих данных в сеансе пользователя. Если вы сделаете это, вы можете просто читать все, что вам нужно, из сессии в будущем, вместо того, чтобы нажимать свою базу данных при каждой загрузке страницы.
Если эти данные являются критическими и / или они должны быть обновлены до второй, тогда избегайте этой опции.
Счетчик кэширования
Если вам нужно определенное количество записей на регулярной основе, рассмотрите возможность установки counter_cache
. В основном в ваших моделях вы делаете следующее:
Parent.rb
has_many :children
Child.rb
belongs_to :parent, :counter_cache => true
Убедитесь, что в вашей таблице parent
есть поле с именем child_count
, и Rails обновит это поле для вас при создании / удалении каждого ребенка. Если вы используете counter_caching, вы не попадете в базу данных, чтобы получить счет.
Примечание: Использование counter_caching приведет к немного более длительному действию создания и уничтожения, но если вы часто используете эти значения, обычно стоит использовать counter_cache.