2011-03-18 2 views
5

Ho un modello Indirizzo come seguireMongoID, incorporando un documento in più documenti

class Address 
    include Mongoid::Document 

    field :line1 
    field :city 
    # more fields like this 

    embedded_in :user, :inverse_of => :permanent_address 
    embedded_in :user, :inverse_of => :current_address 
    embedded_in :college, :inverse_of => :address 
end 

ci sono modelli College e l'utente che incorporare l'indirizzo

class College 
    include Mongoid::Document 

    references_many :users 
    embeds_one :address 

    # some fields and more code 
end 


class User 
    include Mongoid::Document 

    referenced_in :college, :inverse_of => :users 

    embeds_one :permanent_address, :class_name => "Address" 
    embeds_one :current_address, :class_name => "Address" 

    # fields and more code 
end 

io sono sempre alcuni problemi con la messa a punto di cui sopra . Sto usando un unico modulo per chiedere l'indirizzo attuale e permanente insieme ad altre informazioni, ma solo l'indirizzo corrente viene salvato e anche quello con i dati che compio in indirizzo_fisso.

Parameters: 
    {"utf8"=>"✓", 
    "authenticity_token"=>"KdOLvzmKyX341SSTc1SoUG6QIP9NplbAwkQkcx8cgdk=", 
    "user"=> { 
    "personal_info_attributes"=>{...}, 
    "nick_names_attributes"=>{...}, 
    "current_address_attributes"=>{ 
     "line1"=>"", 
     "area"=>"", 
     "country"=>"USA", 
     "postal_code"=>"sd", 
     "city"=>"", 
     "state"=>"", 
     "landmark"=>"", 
     "id"=>"4d891397932ecf36a4000064" 
    }, 
    "permanent_address_attributes"=>{ 
     "line1"=>"", 
     "area"=>"asd", 
     "country"=>"india", 
     "postal_code"=>"", 
     "city"=>"", 
     "state"=>"", 
     "landmark"=>"" 
    }, 
    "commit"=>"Submit", "id"=>"4d8903d6932ecf32cf000001"} 
MONGODB alma_connect['users'].find({:_id=>BSON::ObjectId('4d8903d6932ecf32cf000001')}) 
MONGODB alma_connect['users'].update({"_id"=>BSON::ObjectId('4d8903d6932ecf32cf000001')}, 
    {"$set"=>{ 
    "current_address"=>{ 
     "line1"=>"", 
     "area"=>"asd", 
     "country"=>"india", 
     "postal_code"=>"", 
     "city"=>"", 
     "state"=>"", 
     "landmark"=>"", 
     "_id"=>BSON::ObjectId('4d8916e9932ecf381f000005')}}}) 

Non sono sicuro se questo è qualcosa che sto facendo male qui o c'è qualche altro problema. Sto usando Rails 3.0.4 e MongoID 2.0.0.rc.7

Aggiornamento:

ho aggiornato a 2.0.1 mongoid e cambiato il mio utente per includere inversa di opzioni in indirizzo.

class User 
    include Mongoid::Document 

    referenced_in :college, :inverse_of => :users 

    embeds_one :permanent_address, :class_name => "Address", :inverse_of => :permanent_address 
    embeds_one :current_address, :class_name => "Address", :inverse_of => :current_address 

    # fields and more code 
end 

so l'inverso di nomi non ha senso, ma il punto principale qui è solo per renderli diversi o se si dispone di nomi buoni per le relazioni della tua classe incorporato (come: CURRENT_USER,: permanent_user) , dovresti usarlo per l'inverso di.

risposta

1

Mi sembra buono. Ho una configurazione simile e funziona come previsto.

+0

grazie per la conferma – rubish

+0

sto affrontando alcuni problemi con quanto sopra. Sto usando un singolo modulo per ottenere indirizzo_corrente e indirizzo_sempre, ma viene salvato solo l'indirizzo corrente. – rubish

1

Dal Mongoid docs

Quando un documento secondario incorporato può appartenere a più di un tipo di documento principale, si può dire Mongoid a sostegno di questa aggiungendo l'come opzione per la definizione sui genitori, e il polimorfo opzione sul bambino. Sull'oggetto figlio verrà archiviato un campo aggiuntivo che indica il tipo del genitore.

class Band 
    include Mongoid::Document 
    embeds_many :photos, as: :photographic 
    has_one :address, as: :addressable 
end 

class Photo 
    include Mongoid::Document 
    embedded_in :photographic, polymorphic: true 
end 

class Address 
    include Mongoid::Document 
    belongs_to :addressable, polymorphic: true 
end