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
Stai aggiungendo la funzionalità comune direttamente alla sorgente gemma? Quale classe stai cercando di modificare? – Chris
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. –
Hai mai trovato una soluzione migliore a questo? Sto avendo lo stesso problema. –