Вы хотите переопределить find_every
, который является методом AR, который в конечном итоге запустит find_by_sql
с соответствующим запросом. Переопределение find
не будет работать для настраиваемых искателей, оно просто более хрупкое.
Но чтобы быть совместимым с другими плагинами, вы не можете просто перегружать этот метод. Вместо этого сделайте псевдоним и вызовите оригинальную реализацию после выполнения того, что вы хотите:
module MyPlugin
def self.included(base)
class << base
alias_method :find_every_without_my_plugin, :find_every
def find_every(*args)
# do whatever you need ...
find_every_without_my_plugin(*args)
end
end
end
end
ActiveRecord::Base.send :include, MyPlugin
Это включит ваш плагин для всех классов. Как вы хотите контролировать, какие модели включены? Может быть, стандартный плагин accessor?
class User < ActiveRecord::Base
my_plugin
end
Для поддержки этого вам нужно переместить class << base
в метод класса (таким образом, base
должно быть self
). Как:
module MyPlugin
def self.included(base)
class << base
base.extend ClassMethods
end
end
module ClassMethods
def my_plugin
class << self
alias_method :find_every_without_my_plugin, :find_every
# ...
end
end
end
end