2017-02-23 37 views
2

我一直在追逐一個問題一段時間,仍然無法弄清楚發生了什麼。我無法通過正常的持久性方法編輯從我的寶石製作的文檔,如update,甚至只是編輯屬性,並致電save使用正常的持久化方法通過mongoid更新Rails模型的屬性

例如,調用:

Scram::Policy.where(id: a.id).first.update!(priority: 12345)

不會在所有的工作(沒有錯誤,但該文件一直沒有更新)。但下面將正常工作:

Scram::Policy.collection.find({ "_id" => a.id }).update_one( { "$set" => {"priority" => 12345}})

我不知道我做錯了。調用更新並保存在任何其他模型上都可以正常工作。有問題的文檔來自我的寶石:https://github.com/skreem/scram/blob/master/lib/scram/app/models/policy.rb

我無法編輯其嵌入式文檔(目標)。我曾試圖消除store_in宏,正好在指定一個假的應用程序中使用inverse_ofclass_name重新實現這些類使用什麼等級:https://github.com/skreem/scram-implementation/blob/master/lib/scram/lib/scram/app/models/policy.rb

我試圖重新實現整個寶石放入乾淨的假Rails應用程序:https://github.com/skreem/scram-implementation

運行這些在軌控制檯演示瞭如何更新不起作用: https://gist.github.com/skreem/c70f9ddcc269e78015dd31c92917fafa

這是關於嵌入文檔mongoid的問題,或者是有一些小的複雜性,我在我的代碼失蹤?

編輯: 問題繼續,如果你從我的寶石(急停)的根目錄運行irb,然後運行以下命令:

require "scram.rb" 
Mongoid.load!('./spec/config/mongoid.yml', :test) 

Scram::Policy.first.update!(priority: 32) #=> doesn't update the document at all 

Scram::Policy.where(id: "58af256f366a3536f0d54a61").update(priority: 322) #=> works just fine 

奇怪的是,以下不工作: Scram::Policy.where(id: "58af256f366a3536f0d54a61").first.update(priority: 322)

看起來好像first沒有檢索我想要的。進行相等比較表明,第一個文檔等於where查詢返回的第一個文檔。

回答

0

好吧。事實證明,你不能調用字段collection_name,否則mongoid將確保不好的事情發生在你身上。只是重新命名領域解決了我所有的問題。下面是負責碰撞mongoid中的代碼:https://github.com/mongodb/mongoid/blob/master/lib/mongoid/persistence_context.rb#L82

,這裏是我的寶石,固定我的問題中的承諾:https://github.com/skreem/scram/commit/25995e955c235b24ac86d389dca59996fc60d822

編輯:

確保如果更新您的Mongoid版本,你已經處理了這個問題,並沒有得到任何警告!在mongoid問題跟蹤器上創建問題後,PersistenceContext被添加到禁止方法列表中。現在,試圖使用collection_namecollection作爲一個字段將導致mongoid吐出一些警告。

修正提交:https://github.com/mongodb/mongoid/commit/6831518193321d2cb1642512432a19ec91f4b56d

相關問題