Я работаю над приложением Rails 3.1, в котором в базе данных хранится несколько различных моделей, подобных перечислению. В этих моделях много одинакового кода, а также в связанных с ними контроллерах и представлениях. Я решил проблему дублирования кода для контроллеров и представлений с помощью общего класса родительского контроллера и нового наследования представления/макета, которое является частью Rails 3.
Сейчас пытаюсь решить дублирование кода в моделях, и застрял. Пример одной из моих моделей enum выглядит следующим образом:
class Format < ActiveRecord::Base
has_and_belongs_to_many :videos
attr_accessible :name
validates :name, presence: true, length: { maximum: 20 }
before_destroy :verify_no_linked_videos
def verify_no_linked_videos
unless self.videos.empty?
self.errors[:base] << "Couldn't delete format with associated videos."
raise ActiveRecord::RecordInvalid.new self
end
end
end
У меня есть четыре или пять других классов с почти идентичным кодом (единственное отличие — объявление ассоциации). Я пытался создать модуль с общим кодом, который они все включают (что похоже на Ruby Way), но большая часть дублирующегося кода зависит от ActiveRecord, поэтому методы, которые я пытаюсь использовать в модуле (validate, attr_accessible и т. д.) недоступны. Я знаю об ActiveModel, но это не совсем то, что нужно.
Я также пытался создать общий непостоянный родительский класс, который является подклассом ActiveRecord::Base, но весь код, который я видел для выполнения этого, предполагает, что у вас не будет подклассов непостоянного класса, которые продолжать упорствовать.
Любые предложения о том, как лучше всего избежать дублирования этих идентичных строк кода во многих разных моделях перечисления?