Имам приложение на Rails, което използва скъпоценен камък, наречен ActsAsTaggableOnSteroids, който е Rails Engine. По-конкретно, използвам вилицата на ПавелНартов на скъпоценния камък. Но няма значение за това.
Трябва да добавя специфична функционалност към модела Tag
, който се доставя от двигателя.
Но според моето разбиране за Rails двигателите и магическата функционалност за зареждане в Rails, ако поставя файл, наречен "tag.rb" в моята директория models, тогава той напълно ще замени този от 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 }
Но трябва да има по-добър начин! Имам чувството, че нещо ми липсва. Бих предпочел да не добавям тази странност към приложението си, ако е възможно.