Ассоциация MongoMapper has_many
-
19-09-2019 - |
Вопрос
У меня проблема с ассоциациями 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']
Надеюсь, это помогло.