似乎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为我自动设置它。
其他人见过这个?有解决方案吗?
答案 0 :(得分:0)
最有可能的是,created_at
时间戳是在验证运行后设置的。这实际上是一种非常明智的行为,因为事实上如果它未通过验证就不会创建。您可以删除:required => true
,因为它实际上并没有为您购买任何东西,或者您可以设置before_validation
挂钩来设置时间戳。第二种选择可能会产生意想不到的后果。我不这么认为,但我不太清楚DataMapper是否足以确定。
答案 1 :(得分:0)
在什么情况下你会合理地期望created_at
为NULL?你只是在防范人工操纵数据库中的记录吗?
如果是这种情况,我可能会省略:required=>true
位并在数据库中强制执行该约束。让dm-timestamps
做到这一点。它非常扎实。这似乎是一个务实的解决方案。正如他们所说,“做最简单的事情可能会奏效。”