0

dm-timestamps が created_at および updated_at フィールドを自動設定する前に、DataMapper の検証が実行されるようです。

次の点を考慮してください。

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」をコメントアウトするだけで、問題は解決します。もちろん、単に ":required=>true" を :created_at から削除することもできますが、それは私が求めているものではありません。created_at は必須です。dm-timestamps を使用して自動的に設定しているだけです。

他の誰かがこれを見ましたか?解決策はありますか?

4

2 に答える 2

0

ほとんどの場合、created_atタイムスタンプは検証の実行後に設定されます。実際には、検証に失敗した場合は作成されないため、これはかなり賢明な動作です。:required => true実際には何も購入していないので削除するかbefore_validation、タイムスタンプを設定するフックを設定することができます。2 番目のオプションは、意図しない結果をもたらす可能性があります。私はそうは思いませんが、確信できるほど DataMapper についてよく知りません。

于 2012-04-19T17:53:50.530 に答える
0

Under what circumstances would you reasonably expect created_at to be NULL? Are you just defending against manual manipulation of the records in the database?

If that's the case, I'd probably omit the :required=>true bit and just enforce that constraint in the database. Let dm-timestamps do it's thing. It's pretty solid. That seems like a pragmatic solution. As they say, "Do the simplest thing that could possibly work."

于 2012-04-19T17:58:14.740 に答える