2016-03-14 71 views
2

我想重寫那種_id一代的mongoid(另一個應用程序,這股DB使用的String代替ObjectId()如何全局覆蓋Mongoid :: Document._id代

我可以通過添加做到這一點對每一個模型這樣的:?

field :_id, type: String, default: -> { BSON::ObjectId.new.to_s } 

但是,如何在全球範圍內將這個附加保持乾燥

+0

你忘了添加你正在使用的mongoid版本。 TBH,我沒有看到這一點。你想用這個做什麼? –

+0

版本5.1.x.我想將我的'RoR'應用程序連接到'meteor'託管的'mongoDb'。這個'流星應用程序'將mongoDb ObjectId寫成一個字符串。如果我不覆蓋'mongoid' _id,它將不會獲取流星應用程序創建的條目。 – Jan

回答

0

非常有效的用例,但looking into the code你可能已在Mongoid ::場運氣的,但是你可以重寫mongoize WH ich應該這樣走

Item.new.id 
=> BSON::ObjectId('56e727892ada693ea8000000') 

class BSON::ObjectId 
    def self.mongoize(k) 
    k.to_s 
    end 
end 

Item.new.id 
=> "56e7276f2ada693737000002" 
+0

嗯,似乎正在工作,但'Item.find(params [:id])'不再工作。 '消息: 未找到具有ID(s)56e728dfa54d752083e7435a類的用戶的文檔。 摘要: 使用id或id數組調用User.find時,每個參數必須與數據庫中的文檔相匹配,否則將引發此錯誤。搜索僅供參考:56e728dfa54d752083e7435a ...(總共1件)以及未找到以下ID:56e728dfa54d752083e7435a.' – Jan

+0

您的metor應用程序的年齡?我問,因爲相當長一段時間以來,在Metor中有一個選項來存儲id本身,而不僅僅是一個字符串:http://docs.meteor.com/#/full/meteor_collection –

+0

這是新的。在你建議更新之後,我創建了一個新的(1.2.1):這裏是一個主要的https://gist.github.com/mediatainment/b451b021fbb34e61f3f6 – Jan