2013-04-28 7 views
5

Sto usando mongoid con rails 3 e sono arrivato ultimamente ad un problema molto forte e ho bisogno di un consiglio.ActiveSupport :: Prevenendo ed estendendo il modello mongoid

Sto lavorando su un CMS e una delle idee era che CMS fornirebbe alcuni fondamentali modelli definizioni e utente finale, se necessario, estendere classe di base con le proprie definizioni e controlli e di salvarli in diverse collezioni (tabelle).

class DcPage 
    include Mongoid::Document 

    field a .... 
    belongs_to b .... 
    validates a .... 
end 

class MyPage < DcPage 
    field c .... 
    validates c .... 
end 

Fino all'ultima versione di mongoid questo ha funzionato (con piccolo hack) ei dati sarebbe salvato alla raccolta my_pages. A causa di qualche problema, mongoid no supporta più questo comportamento e i dati vengono sempre salvati nella raccolta dc_pages .

Quando spiegavo il mio problema, il team mongoid mi suggeriva di utilizzare ActiveSupport :: Concern e mi ha fornito un esempio. Che funziona perfettamente OK se la classe estesa è definita nello stesso file sorgente. Quale btw. non succede mai nella prassi

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 

Finora ho scoperto che funziona, se ho bisogno di file di origine di base nella mia secondo file. Che assomiglia a questo: richiede '/some/path/to/my/gem/app/models/dc_page.rb

Riesci a vedere il mio dolore ora. Il file sorgente di base sarebbe naturalmente supportato nella gemma e quindi diventa un bersaglio mobile.

Per favore aiutatemi con una soluzione migliore.

da Ther

+1

Stai aggiungendo la funzionalità comune direttamente alla sorgente gemma? Quale classe stai cercando di modificare? – Chris

+0

Presumo che la classe CommonBehaviour modul e DcPage si trovino nello stesso file sorgente ../app/models/dc_page.rb che è contenuto nel file gem. La classe MyPage è definita all'interno dell'applicazione corrente come ../app/models/my_page.rb e estenderebbe la classe DcPage. In questo scenario include il modulo CommonBehaviur che è incluso in entrambe le classi. –

+0

Hai mai trovato una soluzione migliore a questo? Sto avendo lo stesso problema. –

risposta

1

La ragione per questo non funziona è perché questo è il motivo per la tavola ereditarietà singola. È necessario disattivare l'ereditarietà della tabella affinché funzioni.

Tuttavia, il suggerimento dagli sviluppatori mongoid è la strada corretta da percorrere in questo caso. Sembra che tu abbia bisogno di richiedere correttamente il modulo/le classi.

Problemi correlati