2010-09-22 3 views
2

Скажем, у меня есть системные таблицы категории с 2 фиксированными записями. Пользователь не сможет удалить эти 2, но может пожелать добавить свои собственные, чтобы расширить свой список. Мне нужно в любой момент вытащить категорию «сад», например, при создании садового проекта.Rails: как я могу кэшировать данные системной таблицы

Читатель атрибутов класса, который возвращает экземпляр сада, выполнит эту работу, но я хотел бы знать, как это можно улучшить с помощью кеширования?

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

Пример установки:

class Project < ActiveRecord::Base 
    belongs_to :category 
end 

class Category < SystemTable 
    cattr_reader :garden 
    def self.garden 
    @@garden ||= self.find_by_name('garden') 
    end 
end 

ответ

2

Как о подходе, показанном ниже, который будет извлекать экземпляр сада один раз, когда загружается Category класс:

class Category < SystemTable 
    GARDEN = self.find_by_name('garden') 
end 

Теперь, когда вы нуждаетесь в категории сада можно использовать Category::GARDEN.

1

блокиратор, плагин, который работает с Memcached, автоматически кэширует все экземпляры, которые сделаны по прямой «найти», используя идентификатор. Аналогично, вы можете обойти блокировку и просто кэшировать объект в memcached вручную. Переменные уровня класса - это грязное и потенциально опасное решение (и я даже не уверен, что он работает). Существует много информации об установке и использовании memcached/memcache-client в Интернете.

+0

Должен сказать, что мне не особенно нравится этот подход. Мне нужны категории в БД, и я не хочу полагаться на идентификацию записей. Есть ли у вас идея улучшить подход? Я посмотрю на Interlock/memcached. Спасибо за ваш ответ. – tsdbrown

+0

Я только что посмотрел ваше сообщение: http://webcrisps.wordpress.com/2010/01/07/dynamically-add-class-methods-in-rails/ С тех пор, как вы пишете, вы бы порекомендовали его, как кажется отлично справляйтесь с этой ситуацией !? Мне просто нужно добавить условие, чтобы вытаскивать только записи, не связанные с клиентом. – tsdbrown

+0

Не совсем - мой подход создает метод удобства, но он не кэширует результат и поэтому не добавляет никакой производительности. Это просто для удобства, т. Е. Чтобы сохранить немного ввода кода. –

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