Расширение направляющих ActiveRecord:: Основа

Я сделал некоторое чтение о том, как расширить класс ActiveRecord:Base, таким образом, мои модели имели бы некоторые специальные методы. Что простой способ состоит в том, чтобы расширить его (пошаговое учебное руководство)?

159
задан Benjamin 29 December 2013 в 13:20
поделиться

3 ответа

Есть несколько подходов:

Использование ActiveSupport :: Concern (предпочтительно)

Подробнее читайте в документации 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 ответ .

Исправление Monkey (следует избегать)

Создайте файл в каталоге 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.

335
ответ дан 23 November 2019 в 21:33
поделиться

Шаг 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 :)
7
ответ дан 23 November 2019 в 21:33
поделиться

Вы можете просто расширить класс и просто использовать наследование.

class AbstractModel < ActiveRecord::Base  
  self.abstract_class = true
end

class Foo < AbstractModel
end

class Bar < AbstractModel
end
70
ответ дан 23 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: