MongoMapper has_many ассоциация - PullRequest
       10

MongoMapper has_many ассоциация

3 голосов
/ 08 января 2010

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

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

Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 08 января 2010

Похоже, что 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 в качестве строки, но это «взяло бы», только когда я переключал ее, когда перестраивал моя база данных К счастью, я работаю с тестовыми данными, так что это было достаточно просто.

0 голосов
/ 27 сентября 2011

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

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']

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

0 голосов
/ 08 января 2010

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

...