MongoID, встраивание документа в несколько документов - PullRequest
5 голосов
/ 18 марта 2011

У меня есть модель Адрес как следующий

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

Существуют модели колледжа и пользователя, которые встраивают адрес

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

У меня проблемы с вышеуказанной настройкой. Я использую одну форму для запроса текущего и постоянного адреса вместе с дополнительной информацией, но сохраняется только current_address и то же самое с данными, которые я заполняю в constant_address.

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')}}})

Я не уверен, что здесь я что-то не так делаю или есть какая-то другая проблема. Я использую Rails 3.0.4 и MongoID 2.0.0.rc.7

Обновление:

Я обновился до mongoid 2.0.1 и изменил моего пользователя, чтобы включить обратные параметры в адрес.

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

Я знаю, что инверсия имен не имеет смысла, но главное здесь просто сделать их разными или если у вас есть хорошие имена для отношений во встроенном классе (например, current_user,: constant_user), вы должны использовать что для обратного.

Ответы [ 2 ]

2 голосов
/ 01 мая 2015

Из Mongoid Документы

Когда дочерний встроенный документ может принадлежать более чем одному типу родительского документа, вы можете указать Mongoid, чтобы он поддерживал это, добавив опцию as в определениена родителей, и полиморфный вариант на ребенка.На дочернем объекте будет сохранено дополнительное поле, которое указывает тип родителя.

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
1 голос
/ 18 марта 2011

выглядит хорошо для меня.У меня похожая настройка, и она работает как положено.

...