2011-03-18 2 views
5

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

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 

я получаю некоторые проблемы с выше настройками , Я использую одну форму для запроса текущего и постоянного адреса вместе с дополнительной информацией, но сохраняется только текущий_датчик, и это тоже с данными, которые я заполняю в файле 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,: permanent_user) , вы должны использовать это для обратного.

ответ

1

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

+0

благодарит за отказ – rubish

+0

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

1

От Mongoid docs

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

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 
Смежные вопросы