我开始使用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中的错误吗?
答案 0 :(得分:1)
在提出DataMapper的问题之后,我被告知这是设计的。要使脏跟踪起作用,必须绝对使用属性writer,而不是直接设置实例变量。