0

У меня есть 2 или более модели, которые имеют метод, называемый CapitalizeEachWord.Наследование моделей в Ruby on Rails

Могу ли я получить доступ к классу ActiveRecord::Base и вставить метод внутри? или создать модель под названием Application, которая наследует ActiveRecord::Base напрямую, а затем сделать это BreakPoint и BusCompany унаследовать от нее?

 class BreakPoint < ActiveRecord::Base 
      attr_accessible :city,:province_id,:province 
      belongs_to :province 
      before_save :capitalizeEachWord 
      validates :city, presence: true, 
          uniqueness: true, 
          format: /^([[:alpha:]]+\s?){1,}$/ 
      def capitalizeEachWord 
      self.city=self.city.downcase.split.map(&:capitalize).join(' ') 
      end    
     end 

     class BusCompany < ActiveRecord::Base 
     attr_accessible :company 
     has_many :bus_set_types 
     validates :company, presence: true, 
         uniqueness: true, 
         format: /^([[:alpha:]]+\s?){1,}$/ 

     def capitalizeEachWord 
      self.name=self.name.downcase.split.map(&:capitalize).join(' ') 
     end 
     end 

ответ

1

Способ, которым я видел эту работу лучше всего, очень похож на вашу вторую идею.

Создайте ApplicationModel < ActiveRecord::Base и добавьте в него любую общую логику.

При таком подходе ваши другие модели будут выглядеть примерно так (OauthProvider < ApplicationModel) и включают любую функциональность, которую вы положили в ApplicationModel.

1

Предлагаю ваш второй вариант.

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

1

Вы не можете изменять ActiveRecord :: Base без каких-либо существенных попыток взлома.

Возможно, вы ищете декоратора. Декораторы - это общий шаблон проектирования, который позволяет динамически добавлять функциональные возможности объекта, не создавая статических подклассов.

Этот код климата Blog позволяет узнать, как сделать это в Rails: Refactoring Fat Models

Если вы заинтересованы в некоторых других способов сделать это с помощью простого Ruby (например, модули и Примеси) проверить эту ThoughtBot статью.

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