Расширить модель из движка Rails (не заменить ее)

У меня есть приложение Rails, в котором используется драгоценный камень ActsAsTaggableOnSteroids, представляющий собой механизм Rails. В частности, я использую форк Павла Нартова драгоценного камня. Но неважно это.

Мне нужно добавить определенные функции в модель Tag, которая предоставляется движком.

Но, согласно моему пониманию движков Rails и волшебных функций загрузки в Rails, если я помещу файл с именем "tag.rb" в каталог моих моделей, то он полностью заменит файл из Engine .

В идеале я мог бы сделать что-то вроде:

class Tag < ActsAsTaggable::Tag
  # my stuff
end

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

Итак, я придумал этот кошмар, который я вставил в app/models/tag.rb:

path = ActsAsTaggable::Engine.config.eager_load_paths.grep(/models/).first
require File.join(path, 'tag')
Tag.class_eval { include TagConcern }

Но должен быть лучший способ! Я чувствую, что что-то упускаю. Я бы предпочел не добавлять эту странность в свое приложение, если это возможно.


person Tim Morgan    schedule 28.06.2013    source источник


Ответы (1)


Просто запросите файл, найдя путь к модели драгоценного камня:

require File.join(Gem::Specification.find_by_name("bborn-acts_as_taggable_on_steroids").gem_dir, 'app/models/tag')

Tag.class_eval do
  # ...
end
person aceofspades    schedule 28.06.2013
comment
Спасибо! Это, безусловно, улучшение по сравнению с тем, что я написал. Я подожду еще день или около того, чтобы увидеть, есть ли лучший, более Rails-способ выполнения такого наследования, прежде чем использовать ваш ответ. - person Tim Morgan; 28.06.2013
comment
Оператор require здесь гарантирует, что вы не испортите версию драгоценного камня. Вы можете наследовать от него или использовать class_eval или повторно открыть его по своему усмотрению. - person aceofspades; 28.06.2013