【问题标题】:DataMapper: dm-timestamps doesn't play nice with dm-validations?DataMapper:dm-timestamps 不能与 dm-validations 配合使用?
【发布时间】:2012-04-20 01:58:14
【问题描述】:

似乎在 dm-timestamps 之前运行 DataMapper 中的验证有机会自动设置 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自动给我设置好了。

其他人看到了吗?有解决办法吗?

【问题讨论】:

    标签: ruby validation datamapper


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多