我已经为我的项目编写了一个扩展 ActiveRecord 模型行为的方法,我已经删除了大部分内容,请考虑以下代码:
class ActiveRecord::Base
def self.has_translations
after_initialize :clear_translations_cache
def clear_translations_cache
binding.pry
@_translations = {}
end
end
end
基本上,当我从数据库中获取实例时,我希望 @_translations 实例变量被清除.reload
,但由于某种原因,在从数据库中获取现有对象后,执行填充的方法@_translations
,然后执行object.reload
,@_translations
仍然包含相同的数据。
我确信回调会在第一次从数据库中获取对象和调用.reload
. 我使用 binding.pry 在回调方法中停止执行,但由于某种原因,self.object_id
内部与我的原始对象.reload
不同object_id
,因此@_translations
原始对象不会被清除。
附件是控制台输出:
1.9.3p194 :008 > s = TranslatedItem.first
76: def clear_translations_cache
=> 77: @_translations = {}
78: end
[1] pry(#<TranslatedItem>)> self.class
=> TranslatedItem(id: integer, created_at: datetime, updated_at: datetime)
[2] pry(#<TranslatedItem>)> self.object_id
=> 70254243993580
[3] pry(#<TranslatedItem>)> exit
1.9.3p194 :009 > s.object_id
=> 70254243993580
1.9.3p194 :010 > s.reload
76: def clear_translations_cache
=> 77: @_translations = {}
78: end
[1] pry(#<ServiceLevel>)> self.class
=> TranslatedItem(id: integer, created_at: datetime, updated_at: datetime)
[2] pry(#<TranslatedItem>)> self.object_id
=> 70254259259120