mongoid reference_and_referenced_in_many - PullRequest
1 голос
/ 25 марта 2011

У меня странная проблема. я новичок в mongoid, поэтому у меня возникают проблемы с определением, виноват ли я или mongoid ... представление моего кода является, пожалуй, лучшим объяснением (за исключением полей / проверок / и т. д.)

class User
  include Mongoid::Document
  embeds_one  :profile, :class_name => "UserProfile"
  references_and_referenced_in_many :roles
end

class UserProfile
  include Mongoid::Document
  embedded_in :user
end

class Role
  include Mongoid::Document
  references_and_referenced_in_many :users
end

со следующими ассоциациями, когда я создаю экземпляры этих объектов, например ...

user = User.new :username => 'username',
                :email => 'user@domain.com',
                :password => 'password'
user.build_profile  :first_name => 'John',
                    :last_name => 'Doe',
                    :birthday => Date.new(1980, 1, 1)
user.roles << Role.new(:name => 'Administrator')
user.save

... я могу просмотреть этого пользователя с User.first или user

... я могу просмотреть профиль с User.first.profile и user.profile

... я могу просматривать роли с помощью user.roles, но я НЕ МОГУТ просматривать их с помощью User.first.roles.

еще одна странная вещь: user.roles.count И User.first.roles.count оба возвращают 0, хотя при просмотре user.roles возвращается [#<Role _id: 4d8c0173e1607cdeae00002c, name: "Administrator", user_ids: [BSON::ObjectId('4d8c0173e1607cdeae00002a')]>]. (User.first.roles возвращает пустой массив)

это похоже на ошибку.

1 Ответ

2 голосов
/ 25 марта 2011

use: autosave => true для реляционной ассоциации

references_and_referenced_in_many :roles, :autosave => true

или вы можете явно сохранить role как

role = Role.new(:name => 'Administrator')
user.roles << role
role.save
user.save

Это связано с изменениями в mongoid.2.0.0.rc.1 + в списке здесь .

Реляционные ассоциации больше не автосохранение, когда родительское отношение создано. Ранее сохранить на новый документ с ссылками или ссылка на одну ассоциацию загружена спас бы отношения на первом спасти. Чтобы получить это функциональность назад,: автосохранение => истинная опция должна быть предоставлена макрос (это относится только к reference_many и reference_one)

...