Нужна помощь с MongoID и отношением многие ко многим - PullRequest
0 голосов
/ 01 марта 2011

Использование mongoid 2.0.0.beta.20, если это означает.

Цель довольно проста, но я не могу ее достичь.У меня есть модель User, которая

references_many :worlds, :inverse_of => :users

и World, которая, конечно,

references_many :users, :inverse_of => :worlds

По человеческим словам, пользователь может посетить 0..инф-миры, и мир могут посещать пользователи 1..inf.Мир должен хранить список идентификаторов пользователей, которые были там, и пользователь должен хранить список идентификаторов миров, которые он посетил.Выглядит довольно просто, но не хочет работать для меня.

Теперь есть экземпляр User (назовем его someone) и два экземпляра World (earth и mars, может быть)).Когда я пытаюсь сказать, что someone посетил earth, проблем нет:

earth.users << someone
earth.users.count # => 1

Затем я хочу сказать, что someone также был включен mars:

mars.users << someone
mars.users.count # => 1

Все в порядке?Не уверен:

earth.users.count # => 0
someone.worlds.count # => 0

Я также пытался использовать параметр :stored_as => :array для отношений, но успеха не было вообще (направление не имеет значения):

someone.worlds << earth
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.<<

(илюбой другой Array метод поднимает, что я пытаюсь справиться с нулем)

Может быть, я что-то пропустил в документах или сделал что-то не так.Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 01 марта 2011

Если вы обновитесь до последней версии, тогда вы можете использовать новый макрос для выполнения таких отношений:

references_and_referenced_in_many :worlds

В бета-версии 20 вы были на правильном пути, используя: Store_as =>: массив. Попытка установить значение по умолчанию, как это, и это должно работать для вас.

references_many :worlds, :stored_as => :array, :default => []

0 голосов
/ 01 марта 2011

С MongoID я полагаю, что вам, возможно, придется явно earth.save документ после изменения его на что-то вроде earth.users << someone, чтобы сохранить изменения в «документе».

...