如果: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#save
方法的Post#update
方法应该在操作成功时返回true,如果不成功则返回false。它在这里返回true
,但实际上并没有更新记录。
我搜索过并搜索过,无法在互联网上找到任何相关信息。 StackOverflow和DataMapper rdoc都没有关于更新密钥的任何内容。
我知道我可以拥有一个唯一的Serial
属性,并且只使用slug获取Post
的实例(如同,使Serial
属性成为密钥而不是slug),但如果可能的话,我正在寻找一种没有它的方法。
答案 0 :(得分:2)
我的预感是您无法更新密钥。根据该文件,他们受到保护免受大规模任务:
自然键可以防止质量分配,因此如果您想要设置它们,则需要单独调用它们的setter =。
他们没有谈论更新它们,但通常在“key =&gt; value”存储中,不可能或不赞成更新密钥。虽然我找不到任何确凿证据可以给你,但我认为这也是如此:/