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 回答