سؤال

لدي مشكلة مع جمعيات 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

ما أقوم به خطأ؟

هل كانت مفيدة؟

المحلول

يبدو أنه لم يعد MM يستخدم تنسيق السلسلة لعمود 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 كسلسلة، لكنه لن يحدث إلا "اتخاذ" عندما قمت بإعادة بناء قاعدة البيانات الخاصة بي. لحسن الحظ أنا أعمل مع بيانات الاختبار بحيث كان من السهل بما فيه الكفاية.

نصائح أخرى

ما نوع الأخطاء أو الاستثناءات التي تحصل عليها؟ يبدو الكود الذي نشرته بشكل جيد.

آه، وهذا هو موثق بشكل سيء في مستندات MM. تحتاج إلى القيام بذلك هنا:

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