从Ruby ActiveRecord中的表中提取数据时,使用哪些方法设置属性?

时间:2014-12-10 15:39:48

标签: ruby activerecord

我在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=。我需要在从数据库读入数据时修改某些数据属性,所以有人知道我需要覆盖哪些其他方法吗?

1 个答案:

答案 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并在调用之后对其进行修补。