Я использую мангоид с рельсами 3 и пришла в последнее время к очень сложной проблеме , и мне нужен совет.ActiveSupport :: Концерн и продление монгоидной модели
Я работаю на CMS и одна из идей было то, что CMS обеспечит некоторые базовые модели определения и конечный пользователь, в случае необходимости, расширить базовый класс со своими собственными определениями и управления и сохранять их в различных коллекциях (таблицы).
class DcPage
include Mongoid::Document
field a ....
belongs_to b ....
validates a ....
end
class MyPage < DcPage
field c ....
validates c ....
end
До последней версии Mongoid этого работала (с небольшим хак) и данные будут сохранены в коллекцию my_pages. Из-за какой-то проблемы mongoid no поддерживают эту функцию, и данные всегда сохраняются в dc_pages .
При объяснении моей проблемы команда mongoid предложила использовать ActiveSupport :: Concern и предоставила мне пример. Что работает отлично, если расширенный класс определен в том же исходном файле. Какой кстати. никогда не бывает в практике.
module CommonBehaviour
extend ActiveSupport::Concern
included do
field :subject, type: String, default: ''
# ...
end
end
class DcPage
include Mongoid::Document
include CommonBehaviour
end
class MyPage
include Mongoid::Document
include CommonBehaviour
end
До сих пор я узнал, что это работает, если требуется основной исходный файл в моего второго файла. Это выглядит так: require '/some/path/to/my/gem/app/models/dc_page.rb
Можете ли вы увидеть мою боль сейчас. Основной исходный файл, конечно же, будет подкреплен драгоценным камнем , и поэтому он станет движущейся мишенью.
Пожалуйста, помогите мне с лучшим решением.
от Ther
Вы добавляете общую функциональность непосредственно в источник драгоценных камней? Какой класс вы пытаетесь изменить? – Chris
Я предполагаю, что модули CommonBehaviour modul и DcPage находятся в одном исходном файле ../app/models/dc_page.rb, который содержится внутри файла gem. Класс MyPage определяется внутри текущего приложения как ../app/models/my_page.rb, и он расширяет класс DcPage. В этом случае он включает модуль CommonBehaviur, который включен в оба класса. –
Вы когда-нибудь находили лучшее решение? У меня такая же проблема. –