rails + ActiveRecord: кэширование всех регистров модели - PullRequest
1 голос
/ 16 июня 2010

У меня есть крошечная модель (назовем ее «Узел»), которая представляет древовидную структуру.Каждый узел содержит только имя и ссылку на своего отца:

class Node < ActiveRecord::Base
  validates_presence_of :name, :parent_id
end

Таблица не очень большая - менее 100 элементов.Он обновляется редко - за последние 4 месяца администратором сайта было добавлено 20 новых элементов.

И все же он довольно часто используется в моем приложении.Учитывая его древовидную структуру, в некоторых случаях запрос вызывает более 30 обращений к базе данных (включая вызовы ajax, которые я использую довольно часто).

Я бы хотел использовать какое-то кэширование для того, чтобыуменьшите доступ к базе данных - поскольку таблица настолько мала, я подумал о кэшировании всех регистров в памяти.

Возможно ли это на рельсах 2.3?Есть ли лучший способ справиться с этим?

Ответы [ 3 ]

2 голосов
/ 17 июня 2010

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

Вот простой пример:

before_filter :load_all_nodes

def load_all_nodes
  @nodes = Node.all.inject({ }) { |h, n| h[n.id] = n; n }
end

Это даст вам хэш, индексированный по Node # id, чтобы вы могли использовать этот кеш вместо вызова find:

# Previously
@node = Node.find(params[:id])

# Now
@node = @nodes[params[:id].to_i]

Для небольших простых записей их быстрая загрузка за один раз является довольно недорогой операцией.

1 голос
/ 25 июня 2010

Вы смотрели на любой из плагинов, которые задают поведение, похожее на дерево.

У Райана Бейтса есть railscast на activ_as_tree, однако acts_as_nested_set или один из других проектоввдохновленные этим, такие как awesome_nested_set или acts_as_better_nested_set могут лучше подходить для ваших нужд.

Эти проекты позволяют вам получить узел и всех его дочерних элементов с одним sqlзапрос.На сайте acts_as_better_nested_set подробно описано, как работает этот метод.

0 голосов
/ 25 июня 2010

Посмотрев в нескольких местах, я думаю, что решение Тадмана самое простое.

Для более гибкого решения я нашел следующую суть:

http://gist.github.com/72250/

Привет!

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