Ruby DataMapper看不到分配给的属性@
我刚开始使用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
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