Значение BSON, присутствующее в документе для отношения Mongoid has_and_belongs_to_many, но ссылка недоступна

#ruby-on-rails #mongodb #mongoid #has-and-belongs-to-many

#ruby-on-rails #mongodb #mongoid #имеет-и-принадлежит-многим

Вопрос:

У меня есть отношение has_and_belongs_to между двумя моделями в моем приложении Rails (с использованием Mongoid). Соответствующий бит кода модели:

 has_and_belongs_to_many :intro_users, class_name: 'Game', inverse_of: :intro_games, autosave: true

has_and_belongs_to_many :intro_games, class_name: 'Game', inverse_of: :intro_users, autosave: true
  

Из консоли я вижу, что соответствующий BSON встроен в документы для обеих моделей, и я могу получить доступ к взаимосвязи в одну сторону:

 irb(main):025:0> u = _
=> #<User _id: 52f6cb425365619a52010000, {...},  intro_game_ids: [BSON::ObjectId('535eeb6e53656107dc0c0000')]>
irb(main):026:0> u.intro_games
=> [#<Game _id: 535eeb6e53656107dc0c0000, {...}, intro_user_ids: [BSON::ObjectId('52f6cb425365619a52010000')]>]
  

Но не наоборот. Значение есть в документе, но ссылка возвращается пустой:

 irb(main):022:0> g.reload
=> #<Game _id: 535eeb6e53656107dc0c0000, {...}, intro_user_ids: [BSON::ObjectId('52f6cb425365619a52010000')]>
irb(main):023:0> g.intro_users
=> []
  

Консоль уже перезапущена, так что это не обновление модели. Есть идеи?

Ответ №1:

Похоже, ваша «игра» ссылается на пользователей с неправильным именем класса. Во второй строке должен быть указан класс ‘User’ вместо ‘Game’ — в противном случае mongoid будет искать ‘Game’ с идентификатором ‘User’.

Не уверен, почему mongoid не выдает исключение для этого.

Комментарии:

1. Хороший глаз. Да, так оно и было. Когда я перезапустил консоль с правильным набором class_name, ссылки начали вести себя в обоих направлениях (был удивлен, что это даже позволило мне хранить объекты неправильного класса).