Я хочу написать собственный кэш ActiveRecord, просто для find_by_id
прямо сейчас.
Чтобы сделать это, я хочу перезаписать метод find, когда дается только один int, используйте мой кэш, в противном случае используйте реализацию по умолчанию.
class X < ActiveRecord::Base
def self.find(*args)
return XCache[args[0]] if args.size == 1 && args[0].is_a?(Numeric)
return super.find(*args)
end
end
Все работает найти, кроме случая, когда у меня есть связь с другими экземплярами X, например отношения родитель-ребенок:
has_many :x_children
has_many :children, :class_name => "X", :through => :x_children
Когда я звоню X.find(1).children
, я получаю Enumerator
вместо Array
, что плохо, так как я иногда использую оператор [].
Даже использование перечислителя не работает должным образом - при повторении последней записи я получаю:
NoMethodError: undefined method `call' for :all:Symbol
Любая помощь будет высоко ценится
Дальнейшее объяснение:
XCache - это просто класс, который кэширует экземпляры ActiveRecord.
Упрощенная реализация может быть
class XCache
@@cache = {}
def self.[id]
return @@cache[id] ||= X.find(id)
end
end
(Более продвинутая реализация может включать в себя время истечения, Memcached и т. Д., А более общее решение может поддерживать несколько классов моделей).
Не думаю, что моя проблема связана с реализацией кеша (но я могу ошибаться)