DataMapper:dm-timestamps与dm-validations的搭配不好?

时间:2012-04-19 17:40:15

标签: ruby validation datamapper

似乎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为空。 有趣的是,如果你只是注释掉“require dm-validations”,问题就会消失。 当然,您也可以从:created_at中删除“:required => true”,但这不是我所追求的 - created_at是必需的。只是我正在使用dm-timestamps为我自动设置它。

其他人见过这个?有解决方案吗?

2 个答案:

答案 0 :(得分:0)

最有可能的是,created_at时间戳是在验证运行后设置的。这实际上是一种非常明智的行为,因为事实上如果它未通过验证就不会创建。您可以删除:required => true,因为它实际上并没有为您购买任何东西,或者您可以设置before_validation挂钩来设置时间戳。第二种选择可能会产生意想不到的后果。我不这么认为,但我不太清楚DataMapper是否足以确定。

答案 1 :(得分:0)

在什么情况下你会合理地期望created_at为NULL?你只是在防范人工操纵数据库中的记录吗?

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