0

似乎 DataMapper 中的验证在 dm-timestamps 有机会自动设置 created_at 和 updated_at 字段之前运行。

考虑以下:

require 'dm-core'
require 'dm-migrations'
require 'dm-timestamps'
require 'dm-validations'

class MyResource
  include DataMapper::Resource

  property :mykey, Serial, :key=>true
  property :created_at, DateTime, :required=>true
  property :updated_at, DateTime
end

resource = MyResource.new
resource.save #fails

保存失败,因为 created_at 为空白。有趣的是,如果您只是注释掉“需要 dm-validations”,问题就会消失。当然,您也可以从 :created_at 中删除 ":required=>true" ,但这不是我想要的 - created_at 是必需的。只是我正在使用 dm-timestamps 自动为我设置它。

还有人看到这个吗?有解决办法吗?

4

2 回答 2

0

最有可能的是,created_at时间戳是在运行验证之后设置的。这实际上是一个非常明智的行为,因为如果验证失败,它实际上不会被创建。您可以删除它,:required => true因为它实际上并没有给您购买任何东西,或者您可以设置一个before_validation设置时间戳的钩子。第二种选择可能会产生意想不到的后果。我不这么认为,但我对 DataMapper 的了解不够好,无法确定。

于 2012-04-19T17:53:50.530 回答
0

在什么情况下你会合理地期望created_at为 NULL?您只是在防止手动操作数据库中的记录吗?

如果是这种情况,我可能会省略该:required=>true位,而只是在数据库中强制执行该约束。让dm-timestamps事情去做吧。它很结实。这似乎是一个务实的解决方案。正如他们所说,“做最简单的事情可能会奏效。”

于 2012-04-19T17:58:14.740 回答