Вопрос

У меня проблема с ассоциациями mongomapper.У меня есть одно имя класса User и другое имя Model.У пользователя много моделей, но...

user = User.first
=> <User ...
user.models
=> []
Model.find_by_user_id(user.id.to_s)
=> <Model ...
Model.find_by_user_id(user.id.to_s).user == user
=> true

Код класса (упрощенный):

class User
  include MongoMapper::Document

  # some keys definition

  many :models
end

class Model
  include MongoMapper::Document

  # some keys definitions

  belongs_to :user
end

Что я делаю неправильно?

Это было полезно?

Решение

Похоже, что MM больше не использует формат String для столбца FK, поэтому

Model.find_by_user_id(user.id.to_s)

должно быть

Model.find_by_user_id(user.id)

Кроме того, тип данных столбца Model.user_id должен быть установлен на

key :user_id, Mongo::ObjectID

Когда я столкнулся с этой проблемой, мне пришлось удалить и воссоздать свою коллекцию, чтобы она заработала - другими словами, раньше у меня был user_id в виде строки, но она «принималась» только тогда, когда я переключал ее при перестройке базы данных.К счастью, я работаю с тестовыми данными, так что это было достаточно легко.

Другие советы

Какие ошибки или исключения вы получаете?Код, который вы опубликовали, выглядит нормально.

ах, это плохо документировано в документации мм.Вам нужно сделать это здесь:

class User
  include MongoMapper::Document

  # some keys definition

  many :models, :in => :model_ids
end

class Model
  include MongoMapper::Document

  # some keys definitions
  # no belongs_to necessary here
end

Затем вы можете добавить модели своему пользователю с помощью:

# use an existing object
u = User.create ...
m = Model.create ...

# and add the model to the user
u.models << m

# don't forget to save
u.save

# you can then check if it worked like so:
# u.model_ids  => [ BSON::ID 'your user id']

Надеюсь, это помогло.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top