2016-03-14 76 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