Rails3 / Mongoid:多对多关系和删除操作
我有以下模型:
class User
include Mongoid::Document
include Mongoid::Timestamps
has_and_belongs_to_many :challenged, class_name: "Event", inverse_of: "challengers"
def challenge!(event)
self.challenged << event
self.save!
end
def unchallenge!(event)
self.challenged.where(_id: event.id).destroy_all
self.save!
end
end
class Event
include Mongoid::Document
include Mongoid::Timestamps
has_and_belongs_to_many :challengers, class_name: "User", inverse_of: "challenged"
end
挑战!方法效果很好,但毫无挑战性!一个则不然。 如果我用以下代码测试它:
require 'spec_helper'
describe User do
before(:each) do
@user = User.create!
@event = Event.create!
end
it "should unchallenge an event" do
@user.challenge!(@event)
@user.unchallenge!(@event)
@user.challenged.should_not include(@event)
end
end
测试失败;所以看来删除操作没有起作用。
应用程序日志是:
MONGODB test_mongo_test['users'].insert([{"challenged_ids"=>[], "_id"=>BSON::ObjectId('4f2d13fdbd028603f7000001')}])
MONGODB test_mongo_test['system.namespaces'].find({})
MONGODB test_mongo_test['events'].insert([{"challenger_ids"=>[], "_id"=>BSON::ObjectId('4f2d13fdbd028603f7000002')}])
MONGODB test_mongo_test['events'].update({"_id"=>BSON::ObjectId('4f2d13fdbd028603f7000002')}, {"$addToSet"=>{"challenger_ids"=>{"$each"=>[BSON::ObjectId('4f2d13fdbd028603f7000001')]}}})
MONGODB test_mongo_test['users'].update({"_id"=>BSON::ObjectId('4f2d13fdbd028603f7000001')}, {"$pushAll"=>{"challenged_ids"=>[BSON::ObjectId('4f2d13fdbd028603f7000002')]}})
MONGODB test_mongo_test['$cmd'].find({"count"=>"events", "query"=>{"$and"=>[{:_id=>{"$in"=>[BSON::ObjectId('4f2d13fdbd028603f7000002')]}}, {:_id=>BSON::ObjectId('4f2d13fdbd028603f7000002')}]}, "fields"=>nil}).limit(-1)
MONGODB test_mongo_test['events'].remove({"$and"=>[{:_id=>{"$in"=>[BSON::ObjectId('4f2d13fdbd028603f7000002')]}}, {:_id=>BSON::ObjectId('4f2d13fdbd028603f7000002')}]})
MONGODB test_mongo_test['events'].find({:_id=>{"$in"=>[BSON::ObjectId('4f2d13fdbd028603f7000002')]}})
MONGODB test_mongo_test['events'].find({:_id=>{"$in"=>[BSON::ObjectId('4f2d13fdbd028603f7000002')]}})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
检查您的应用程序日志
如果我是对的 self.challenged 返回事件条件,而不是用户条件,所以修复是:
self.challenged.where(_id: event.id).destroy_all
更新:
我已经编写与您相同的测试(只是型号名称不同):
这样我的测试就会失败。然后我改变:
是的,有点棘手,绝对应该放在 mongoid 跟踪器中。希望这会对您有所帮助。
Check your application log
If I'm right self.challenged returns Event criteria, not User criteria, so fix is:
self.challenged.where(_id: event.id).destroy_all
Upd:
I've written same test as you did( just different model names ):
This way i get my tests failed. Then I change:
Yap, little bit tricky, and definitely should be placed in mongoid tracker. Hope this will help you.