将属性集更新为DataMapper中的键

时间:2015-08-31 00:08:00

标签: ruby ruby-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#save方法的Post#update方法应该在操作成功时返回true,如果不成功则返回false。它在这里返回true,但实际上并没有更新记录。

我搜索过并搜索过,无法在互联网上找到任何相关信息。 StackOverflow和DataMapper rdoc都没有关于更新密钥的任何内容。

我知道我可以拥有一个唯一的Serial属性,并且只使用slug获取Post的实例(如同,使Serial属性成为密钥而不是slug),但如果可能的话,我正在寻找一种没有它的方法。

1 个答案:

答案 0 :(得分:2)

我的预感是您无法更新密钥。根据该文件,他们受到保护免受大规模任务:

  

自然键可以防止质量分配,因此如果您想要设置它们,则需要单独调用它们的setter =。

他们没有谈论更新它们,但通常在“key =&gt; value”存储中,不可能或不赞成更新密钥。虽然我找不到任何确凿证据可以给你,但我认为这也是如此:/