我有一个对象PersistentObject
,你可以认为它是从ORM中弹出的,它是一个可以在你的编程语言中原生使用的对象(与后端无关),它有方法load
和save
,数据库。在Ruby中,如何在实现为类方法的构造函数中初始化实例变量?
我希望我的PersistentObject
是可伪造的,即我希望能够将它初始化为一个轻量级指针,该指针仅用于引用数据库中的对象。当(如果)时刻到了,我可以通过实际访问数据库并将其提取出来将它错误地写入内存。这里的要点是能够将该对象添加到集合中作为参考,而不需要获取对象。我也希望能够用传统的构造函数初始化旧的对象,然后将其提交给数据库(当你需要从头开始创建一个新对象,而不是操纵现有对象时,这很方便)。
所以我有一个对象具有多个构造函数:一个经典的,一个基于数据库中的对象GUID创建错误。当对象初始化为错误时,我希望实例方法能够作为实例变量访问该状态,因为错误操作与完全加载的对象上的操作不同。但由于显而易见的原因,我不希望客户弄乱我的内心状态,所以我不想为伊娃创建一个访问者。所以我的问题是,我如何从对象实例中的类方法初始化/设置ivar,以便我的类的外部客户端不能混淆它(即将其值设置为其他值)?
对不起,所有的代码应该使它更清晰。我试过一些显然不起作用的东西,但很好地说明了这一点。道歉,如果这是一个基本的问题,我对Ruby很新。
class PersistentObject
def initialize(opts={})
@id = opts[:id] || new_id
@data = opts[:data] || nil
end
def self.new_fault(id)
new_object = PersistentObject.new
[email protected] = true #<----- How do you achieve this?
new_object
end
def new_id
#returns a new globally unique id
end
def fault?
@fault
end
def load
if fault?
#fault in the object from the database by fetching the record corresponding to the id
@fault = false
end
end
def save
#save the object to the database
end
end
#I create a new object as a fault, I can add it to collections, refer to it all I want, etc., but I can't access it's data, I just have a lightweight pointer which can be created without ever hitting the database
o = PersistentObject.new_fault("123")
#Now let's suppose I need the object's data, so I'll load it
o.load
#Now I can use the object, change it's data, etc.
p o.data
o.data = "foo"
#And when I'm ready I can save it back to the database
o.save
编辑: 我应该说,我的心脏没有被设置在从类方法访问该实例的伊娃,我很高兴地听到一个惯用的Ruby模式的解决此问题的详细。