1

Ruby と DataMapper を使い始めたところ、意味がないと思われる問題に遭遇しました。次のモデルがあるとしましょう:

class Foo
  include DataMapper::Resource

  property :id, Serial
  property :date, Date, required: true

  def initialize
    @date = Date.today
  end
end

IRB を開いてモデルをテストし、データベース接続をセットアップして、新しい foo を保存しようとします。

> foo = Foo.new
> foo.date
=> #<Date: 2013-03-28 ((2456380j,0s,0n),+0s,2299161j)>
> foo.save

次に、次の例外が発生します。

DataObjects::IntegrityError: foos.date は NULL ではない可能性があります

日付を必須としてマークしたので、これは完全に理にかなっています。しかし、日付はそこにあります!クラスのコンストラクターで割り当てました!また、今日の日付で初期化せずに保存しようとすると、検証エラーが発生するだけです。例外なし。

私が理解できないのは(そしてこれがあなたに答えてもらいたいことです)、

@date = Date.today

self.date = Date.today

できます!foo は正しく保存されます。何故ですか?DataMapper 内のバグですか?

4

1 に答える 1

1

DataMapper の担当者にこの問題を提起したところ、これは設計によるものだと言われました。ダーティ トラッキングを機能させるには、アトリビュート ライターを絶対に使用する必要があり、インスタンス変数を直接設定しないでください。

于 2013-03-29T12:19:15.907 に答える