我在Ruby(非Rails)应用程序中使用ActiveRecord 4.1.8。我有一个表和相应的模型,如下所示:
create_table 'people', :force => true do |t|
t.string 'name'
end
class Person < ActiveRecord::Base
def name=(name)
puts "Attribute setter for name called with #{name}"
write_attribute(:name, name)
end
end
当我创建Person的新实例时,我看到写入STDOUT的Attribute setter for name called with...
。但是,当我重新加载模型实例时,我没有看到写入STDOUT的消息。
p = Person.create(name: 'foobar')
--> Attribute setter for name called with foobar
p.reload
--> <nothing>
模型被持久化到数据库,因此这让我觉得当数据从数据库加载到模型中时不会使用name=
。我需要在从数据库读入数据时修改某些数据属性,所以有人知道我需要覆盖哪些其他方法吗?
答案 0 :(得分:0)
来自active_record/persistence.rb
来源:
def reload(options = nil)
clear_aggregation_cache
clear_association_cache
fresh_object =
if options && options[:lock]
self.class.unscoped { self.class.lock(options[:lock]).find(id) }
else
self.class.unscoped { self.class.find(id) }
end
@attributes = fresh_object.instance_variable_get('@attributes')
@new_record = false
self
end
它只是直接替换属性hash。似乎最简单的处理方法是覆盖reload
并在调用之后对其进行修补。