2012-04-19 5 views
0

dm-timestampsがcreated_atおよびupdated_atフィールドを自動設定する機会がある前に、DataMapperの検証が実行されているようです。DataMapper:dm-timestampsはdm-validationsでうまく再生されませんか?

は、次のことを考えてみましょう:

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を使用していることです。

誰でもこれを見ましたか?解決策はありますか?

答えて

0

おそらく、created_atタイムスタンプは、検証の実行後に設定されます。検証に失敗した場合、実際には作成されないので、実際はかなり賢明な動作です。 :required => trueは実際には何も購入していないので削除するか、タイムスタンプを設定するフックbefore_validationを設定することができます。第2の選択肢は意図しない結果を招くことがあります。私はそうは思わないが、私はDataMapperをよく知っているだけで十分ではない。

0

created_atはどのような状況でNULLになると思いますか?データベース内のレコードを手動で操作することに対して防御していますか?

その場合、おそらく:required=>trueビットを省略し、その制約をデータベースに適用するだけです。 dm-timestampsはそれをやってみましょう。それはかなり固いです。それは実用的な解決策のようだ。彼らが言うように、「おそらく働くことができる最も簡単なことをやってください」。

関連する問題