- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经为我的项目编写了一个扩展 ActiveRecord 模型行为的方法,我已经删除了其中的大部分内容,请考虑以下代码:
class ActiveRecord::Base
def self.has_translations
after_initialize :clear_translations_cache
def clear_translations_cache
binding.pry
@_translations = {}
end
end
end
基本上,当我从数据库中.reload
实例时,我希望清除@_translations 实例变量,但出于某种原因,在从数据库中获取现有对象后,执行一个方法填充@_translations
,然后执行object.reload
,@_translations
仍然包含相同的数据。
我确信当第一次从数据库中获取对象和调用 .reload
时会执行回调。我使用 binding.pry 在回调方法中停止执行,但由于某些原因 .reload
中的 self.object_id
与我的 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
最佳答案
我猜你看到的行为与 ActiveRecord reload 的方式有关作品:
fresh_object = self.class.unscoped { self.class.find(self.id, options) }
@attributes.update(fresh_object.instance_variable_get('@attributes'))
您会注意到它是通过从数据库中查找对象来创建新对象的,这解释了为什么您在回调方法中看到两个不同的 object_id 值。在重新加载期间初始化的对象仅用于其属性,然后超出范围。
从你的问题中不清楚你是否只是好奇为什么它会这样,或者你是否正在寻找一种替代方法来做到这一点。
更新:
如果您只是在寻找一种在重新加载模型时清除实例变量的方法,那么您有几个选择。
1) 添加您自己的可以显式调用的重新加载方法:
class ActiveRecord::Base
def reload_everything
reload
@_translations = {}
end
end
object.reload_everything
2) 改变reload的行为
module ReloadTranslations
def reload(*args)
super
@_translations = {}
end
end
ActiveRecord::Base.send(:include, ReloadTranslations)
关于mysql - RoR - obj.reload 后 after_initialize 回调中的不同 object_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556135/
我注意到对于 SYS 模式中的某些对象,以下两列报告不同的值: ALL_OBJECTS.OBJECT_ID ALL_PROCEDURES.OBJECT_ID ALL_ARGUMENTS.OBJECT_
@father = Hierarchy.find(:first, :conditions => ['label = ?', 'father']) @father.children.each do
我在使用以下语句时遇到错误。 Select name as ColumnName From tempdb.sys.columns where object_id = object_id('tempdb
第二个选择(从链接服务器)不返回任何值.. Object_ID 不工作。有什么解决方法吗? select '', name FROM sys.databases WHERE 1 = 1 AND
在 Azure synapse 专用 SQL 池上的存储过程中,我需要获取当前正在执行的存储过程的 object_id SQL Server有非常有用的系统变量@@PROCID 但是 @@PROCID
如标题所示,有人知道如何使用 keycloak 获取 oidc 身份提供商中用户的对象 id 吗? 在 Azure Active Directory 进行身份验证时,我无法找到添加自定义映射器来获取用
如标题所示,有人知道如何使用 keycloak 获取 oidc 身份提供商中用户的对象 id 吗? 在 Azure Active Directory 进行身份验证时,我无法找到添加自定义映射器来获取用
我需要检查 SQL 中的表是否存在。 如果没有,它必须自动创建一个。 现在我研究并找到了这段代码: IF NOT EXISTS (SELECT * FROM sys.objects WHERE ob
我在 Rails 3 上有一个带有 PostgreSQL 数据库的应用程序。 问题是:我想用 object_id 存储坐标以便像这样访问它: Post1 -> Coordinates [100,200
我正在研究 Ruby 的 .object_id 并注意到,在 irb 的几个连续 session 中,我得到了这些相同的结果: false.object_id // 0 true.object_id
我在 Itzik Ben-Gan 的《TSQL Fundamentals》一书中遇到了以下代码。 我了解函数 OBJECT_ID 用于检查特定对象是否存在。但是我对它的第二个参数 N'U' 有点困惑。
我在 MS SQL Server 2012 中遇到一个奇怪的问题。我正在尝试检查升级脚本中是否已存在外键。我过去曾使用系统 OBJECT_ID() 函数来查找表、 View 和过程,但是当我尝试使用它
在创建函数时,我倾向于在创建前先检查是否存在 IF Object_ID(N'myfunc', N'IF') IS NOT NULL DROP FUNCTION myfunc GO CREATE FUN
我正在尝试实现一个简单的应用程序,它能够获取给定 object_id 的集合。 来自服务器的 GET 响应 如下所示: [ {object_id: 1, text: "msg1"},
由于逻辑和缺乏使用 JQuery/Javascript 的经验,我发现自己遇到了这个问题。 背景- 我正在使用 Jquery-deep branch Complex-Form-Examples 的集合
我正在玩一些 ruby 代码并做类似的事情: 1.9.3-p392 :012 > class Mx; self; end.object_id => 70263149976460 1.9.3-p3
使用 ruby-hacking-guide site ,我发现 fixnum Symbol.all_symbols.find {|sym| sym.to_s == 'matt' } => nil
请注意,object_id 的 18,10 和 21 与 cart_id 3 相关联一次。我想知道组合是否在另一个 cart_id 中再次出现,以及在所有存在的行中出现了多少次。我希望有两列作为结果集
假设我有以下对象数组: objects = [{id: 1, installs: 21}, {id: 2, installs: 10}, {id:1, installs: 11}, {id:3, in
我使用数据库脚本检查存储过程是否存在,然后删除它然后创建它。 以下哪项对于检查和删除 SP 更有效 选项 1 IF EXISTS(SELECT * FROM sys.objects WHERE OBJ
我是一名优秀的程序员,十分优秀!