Я сделал некоторое чтение о том, как расширить класс ActiveRecord:Base, таким образом, мои модели имели бы некоторые специальные методы. Что простой способ состоит в том, чтобы расширить его (пошаговое учебное руководство)?
Есть несколько подходов:
Подробнее читайте в документации ActiveSupport :: Concern .
Создайте файл с именем active_record_extension.rb
в каталоге lib
.
require 'active_support/concern'
module ActiveRecordExtension
extend ActiveSupport::Concern
# add your instance methods here
def foo
"foo"
end
# add your static(class) methods here
class_methods do
#E.g: Order.top_ten
def top_ten
limit(10)
end
end
end
# include the extension
ActiveRecord::Base.send(:include, ActiveRecordExtension)
Создайте в каталоге config / initializers
файл с именем extensions.rb
и добавьте в файл следующую строку:
require "active_record_extension"
См. Toby's ответ .
Создайте файл в каталоге config / initializers
с именем active_record_monkey_patch.rb
.
class ActiveRecord::Base
#instance method, E.g: Order.new.foo
def foo
"foo"
end
#class method, E.g: Order.top_ten
def self.top_ten
limit(10)
end
end
Знаменитая цитата Джейми Завински о регулярных выражениях может быть переформулирована, чтобы проиллюстрировать проблемы, связанные с исправлением обезьян.
Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я воспользуюсь исправлением обезьян». Теперь у них две проблемы.
Исправление Monkey выполняется легко и быстро. Но сэкономленное время и усилия всегда извлекаются когда-нибудь в будущем; со сложными процентами. В наши дни я ограничиваю установку патчей обезьяны, чтобы быстро создать прототип решения в консоли rails.
Шаг 1
module FooExtension
def foo
puts "bar :)"
end
end
ActiveRecord::Base.send :include, FooExtension
Шаг 2
# Require the above file in an initializer (in config/initializers)
require 'lib/foo_extension.rb'
Шаг 3
There is no step 3 :)
Вы можете просто расширить класс и просто использовать наследование.
class AbstractModel < ActiveRecord::Base
self.abstract_class = true
end
class Foo < AbstractModel
end
class Bar < AbstractModel
end