Documento incorporato (embedded) e non incorporato (no-embedded) contemporaneamente

Ho bisogno di un modello che si comporterà come incorporato e non incorporato. Ad esempio, se voglio archiviare questo modello come incorporato:

class MenuPosition
  include Mongoid::Document
  field :name, type: String
  field :category, type: String

devo aggiungere

embedded_in :menu

ad esso.

D'altra parte, se aggiungo questa riga nel modello, non posso memorizzare questo modello come non incorporato:

position = {
            "name" => "pork",
            "category" => "meal",
            "portion" => 100
        }
MenuPosition.create(position)

Ricevo il seguente messaggio di errore:

NoMethodError:
       undefined method `new?' for nil:NilClass

Posso usare, o esiste un modo di definire un modello per documenti incorporati (embedded) e non incorporati (no-embedded) in MongoDB?

In Corso 5
MongoDB 11-09-2019 1 Risposta 869 Visite +1
Gaetano Malchì

Gaetano Malchì

Autore di questa domanda

Risposte ( 1 approvate )

  1. Bruno Verzinesi
    +1
    11-09-2019 18:21:54
    Rispondi

    Nel nostro progetto abbiamo avuto a che fare con una cosa simile. Quello che abbiamo fatto è stato definire i campi come un modulo. Un po' come quello mostrato qui di seguito:

    module SpecialFields
      extend ActiveSupport::Concern
    
      included do
        field :my_field, type: String
        field :my_other_field, type: String
      end
    end

    Quindi nella tua classe in cui vuoi incorporare il modello, fai semplicemente:

    include SpecialFields

    Ed invece nella tua classe che desideri archiviare separatamente come documento non incorporato (non-embedded), procedi come segue:

    class NotEmbeddedDoc
      include Mongoid::Document
    
      include SpecialFields
    end

    Questo ha funzionato abbastanza bene nel nostro progetto per alcune cose. Tuttavia tieni presente che potrebbe non essere appropriato nel tuo caso, poiché hai esigenza di incorporarne molti. Questo funziona bene solo per incorporare uno. L'ho pubblicato comunque, eventualmente puoi partire da questo per cercare di migliorarlo ed adattarlo alle tue esigenze.

Rispondi

Per poter rispondere a questa domanda, devi essere registrato e loggato sul sito, dopodichè compila il box sottostante cercando di essere il più chiaro ed esauriente possibile, la tua risposta potrebbe essere la soluzione che l'utente cerca ed essere contrassegnata come migliore, consentendoti così di ottenere punti ed autorevolezza.

 Domanda Precedente

 Elenco Domande 

Domanda Successiva