Ruby DataMapper看不到分配给的属性@

Ruby DataMapper看不到分配给的属性@,ruby,datamapper,ruby-datamapper,Ruby,Datamapper,Ruby Datamapper,我刚开始使用Ruby和DataMapper,我偶然发现了一个我认为毫无意义的问题。假设我有以下模型: class Foo include DataMapper::Resource property :id, Serial property :date, Date, required: true def initialize @date = Date.today end end 我打开IRB来测试我的模型,设置数据库连接,并尝试保存一个新的foo: > fo

我刚开始使用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


它起作用了!foo已正确保存。为什么呢?这是DataMapper内部的一个bug吗?

在向DataMapper的人员提出这个问题后,我被告知这是出于设计。要使脏跟踪正常工作,您必须绝对使用属性编写器,而不是直接设置实例变量。

在向DataMapper的人员提出这个问题后,我被告知这是出于设计。为了让肮脏的追踪工作,您必须绝对使用属性编写器,而不是直接设置实例变量。

这意味着DataMapper保留某种内部设置/未设置数据结构,只有在您使用其setter/getter而不是基础变量时,才会对其进行操作。@Linuxios:有没有办法使其按逻辑方式工作?它目前的工作方式非常违反直觉。完全按照你说的做,并使用
self.date
。实例变量是类中最内部的部分——如果您使用它们与DataMapper的内部进行交互,则会使您陷入混乱。@Linuxios我不想与DataMapper的内部进行交互,我只想在对象上设置一个属性。我可能很挑剔,但我发现将每个作业重写为
self.
而不是
@
只是为了确保将我的属性持久化到数据库,这很麻烦,但却是必要的。编写DataMapper的人可以让这一切成为可能,但你必须让他们接受。这意味着DataMapper保留了某种内部的set/not set数据结构,只有当你使用他们的setter/getter而不是底层变量时,才会对其进行操作。@Linuxios:有没有办法让它按逻辑方式工作?它目前的工作方式非常违反直觉。完全按照你说的做,并使用
self.date
。实例变量是类中最内部的部分——如果您使用它们与DataMapper的内部进行交互,则会使您陷入混乱。@Linuxios我不想与DataMapper的内部进行交互,我只想在对象上设置一个属性。我可能很挑剔,但我发现将每个作业重写为
self.
而不是
@
只是为了确保将我的属性持久化到数据库,这很麻烦,但却是必要的。写DataMapper的人可以让这成为可能,但你必须和他们一起去做。
@date = Date.today
self.date = Date.today