2013-04-28 5 views
5

Я использую мангоид с рельсами 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

+1

Вы добавляете общую функциональность непосредственно в источник драгоценных камней? Какой класс вы пытаетесь изменить? – Chris

+0

Я предполагаю, что модули CommonBehaviour modul и DcPage находятся в одном исходном файле ../app/models/dc_page.rb, который содержится внутри файла gem. Класс MyPage определяется внутри текущего приложения как ../app/models/my_page.rb, и он расширяет класс DcPage. В этом случае он включает модуль CommonBehaviur, который включен в оба класса. –

+0

Вы когда-нибудь находили лучшее решение? У меня такая же проблема. –

ответ

1

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

Однако предложение от разработчиков mongoid - правильный путь, чтобы идти в этом случае. Похоже, вам просто нужно правильно спросить свой модуль/классы.