我觉得比较认可的方式做,这是提供虚拟属性的定制的setter,然后提供一个after_create钩来设定数值创建记录后。
下面的代码应该做你想做的。
class Virt < ActiveRecord::Base
def after_create()
self.virtual_attr = nil # Set it to anything just to invoke the setter
save # Saving will not invoke this callback again as the record exists
# Do NOT try this in after_save or you will get a Stack Overflow
end
def virtual_attr=(value)
write_attribute(:virtual_attr, "ID: #{self.id} #{value}")
end
end
在控制台运行此显示了以下
v=Virt.new
=> #<Virt id: nil, virtual_attr: nil, created_at: nil, updated_at: nil>
>> v.save
=> true
>> v
=> #<Virt id: 8, virtual_attr: "ID: 8 ", created_at: "2009-12-23 09:25:17",
updated_at: "2009-12-23 09:25:17">
>> Virt.last
=> #<Virt id: 8, virtual_attr: "ID: 8 ", created_at: "2009-12-23 09:25:17",
updated_at: "2009-12-23 09:25:17">
我假设他有一个名为virtual_attr,在一个数据库中的列基于ID。 – 2009-12-23 09:32:21
可能是,但通常属性是虚拟的,因为它们没有相应的数据库列。它们通常来自现有的栏目。当谈到Rails时,我从来没有听说过任何其他虚拟属性的定义。 – EmFi 2009-12-23 11:22:33
好点。我已经将这个问题改为使用派生属性而不是虚拟属性。 – 2009-12-23 16:06:00