rails中的mongoid原子更新

时间:2011-04-23 00:44:28

标签: ruby-on-rails mongoid

我在更新rails中的现有文档复合键字段时遇到问题。我的update_attributes语句的关联mongo查询似乎是正确的,但之后无法找到该对象。

例如,现有对象的first_name为“Jane”,last_name为“Doe”...我的:key为:first_name, :last_name

我点击了我的更新方法:

{"artist"=>{"last_name"=>"Doe", "first_name"=>"John"}, "commit"=>"Update Artist", "id"=>"jane-doe"}

  def update
    @artist = Artist.find(params[:id])
    if @artist.update_attributes(params[:artist])
      redirect_to @artist
    end
  end

生成mongo查询:MONGODB app_database['artists'].update({"_id"=>"jane-doe"}, {"$set"=>{"_id"=>"john-doe", "first_name"=>"John"}})

这对我来说似乎是正确的...但是当我被重定向到那位新艺术家时,却抱怨Document not found for class Artist with id(s) john-doe.

实际上从mongo控制台查看我的数据库,我仍然看到Jane Doe在那里。它与复合关键字段有关,因为我可以很好地更新非关键字段。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

我在我自己的应用程序中尝试了这个,看起来MongoDB目前还没有允许你修改_id字段作为$ set操作的一部分(这是Mongoid用来执行更新的)。这是一个奇怪的限制 - 我现在已经使用Mongo一年半了,而且我从来没有遇到它。

所以,有几个选择:

  • 停止使用可能需要稍后更改的_id的任何内容。我这样做 - 无论如何这都是最好的做法。

  • 每当您需要进行其中一个_id更改时,请使用新的_id属性创建新记录并删除旧记录。这可能会变得混乱,特别是如果您有其他模型通过id引用您的Artist模型。

  • 提出10gen的问题,要求取消此限制。他们非常善于回应用户'关注,但即使他们同意,也可能需要一段时间才能完成。

  • 向Mongoid提出一个问题,要求支持这些类型的更改(Mongoid可以想象为你处理创建+删除机制),但老实说,这是一种边缘情况。'可能不值得花费额外的时间和代码来支持他们。如果Mongoid在您尝试进行此类更新时出现错误,那就太好了。