更新 属性 集作为 DataMapper 中的键

Updating a property set as the key in DataMapper

如果 :key 设置为 true,是否可以在 DataMapper 中更新 属性?

比如说,我有一个这样设置的模型:

class Post
  include DataMapper::Resource
  property :slug, Text, :unique => true, :key => true
  # ...
end

我用 :slug => "example-post-title" 创建了一个新实例。

我试图通过访问存储的

来更新它
@post = Post.get("example-post-title")
#=> #<Post @slug="example-post-title" ...>
@post.slug = "example-post-title-2"
#=> "example-post-title-2"
@post.save
#=> true
@post = Post.get("example-post-title-2")
#=> nil

但是如您所见,该 slug 从未更新过。我也尝试使用 Post#update 方法:

@post = Post.get("example-post-title")
#=> #<Post @slug="example-post-title" ...>
@post.update(:slug => "example-post-title-2")
#=> true
@post = Post.get("example-post-title-2")
#=> nil

在数据库中查看,这些示例中的任何一个都没有更改索引列。它仍然是 example-post-title 而不是 example-post-title-2.

根据文档,Post#update 方法与 Post#save 方法类似,如果操作成功,应该 return 为真,否则为假。它在这里 returning true,但实际上并没有更新记录。

我在网上找了又找,也找不到任何关于它的资料。 Whosebug 和 DataMapper rdoc 都没有关于更新密钥的任何内容。

我知道我可以有一个独特的 Serial 属性 并使用 slug 获取 Post 的实例(例如,使 Serial 属性 键而不是 slug),但如果可能的话,我正在寻找一种没有它的方法。

我的预感是您无法更新密钥。根据文档,它们受到保护以防止批量分配:

Natural Keys are protected against mass-assignment, so their setter= will need to be called individually if you're looking to set them.

他们不谈论更新它们,但通常在 "key => value" 商店中更新密钥是不可能的或被弃用的。我假设这里也是这种情况,即使我找不到任何确凿的证据给你:/