Rails3 / Mongoid:多对多关系和删除操作

时间:2012-02-03 17:12:18

标签: ruby-on-rails ruby ruby-on-rails-3 many-to-many 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')]}})

1 个答案:

答案 0 :(得分:1)

检查您的申请日志

如果我是正确的自己。挑战回复事件标准,而不是用户标准,所以修复是:

self.challenged.where(_id: event.id).destroy_all

UPD:

我和你一样编写了相同的测试(只是不同的模型名称):

# announcement_list.rb
def challenge!(announce)
  self.announcements << announce
  self.save!
end

def unchallenge!(announce)
  self.announcements.where( _id: announce.id ).destroy_all
  self.save!
end

#anouncement_list_spec.rb
context 'stackoverflow#9132596' do
  let!( :announcement_list ) { Factory( :announcement_list ) }
  let!( :announcement ) { Factory( :announcement ) }
  it 'kick announcement out of list on unchallenge! method call' do
    announcement_list.challenge!( announcement )
    announcement_list.unchallenge!( announcement )
    announcement_list.announcements.should_not include( announcement )
  end
end

这样我的测试失败了。然后我改变了:

def unchallenge!(announce)
  self.announcements.destroy_all( conditions: { _id: announce.id })
  self.save!
end

哎呀,有点棘手,绝对应该放在mongoid跟踪器中。希望这会对你有所帮助。

相关问题