基于 GlobalID 的 ActiveRecord 对象的行为是否存在陷阱?
Is there a gotcha in the behavior of GlobalID based ActiveRecord objects?
完全有可能我做错了什么但是!
这是故事。我有一个标准的初学者级别的 RoR 设置 (4.2) 和 ActiveJob 作业。
我的一项工作对传入的记录调用一个方法,目的是修改该记录。到目前为止很正常。它看起来像这样:
class GenericScraperJob < ActiveJob::Base
def perform(record)
# perform job with record data
record.update_myself!
end
end
然后 update_myself!
方法如下所示:
class RecordInDb < ActiveRecord::Base
def update_myself!
thisis_a_column = newvalue
self.save!
end
end
神秘之处在于 - 当我 运行 测试并检查 fixture_instance.thisis_a_column
是否为 newvalue
时,测试通过。当我启动我的应用程序并查看数据库中发生的情况时,它未按预期更新。
但是如果我说 self.thisis_a_column = newvalue
,那么它在任何地方都可以正常工作。
我确定我重新加载了我的夹具...我是这样做的:fixture_instance = RecordinDb.find(fixture_inst.id)
就好像 ActiveRecord 实例内部的绑定发生了变化,这取决于它被实例化的时间。在我的测试中,符号似乎被视为可能发送到 self
的消息,但在工作中,它们被视为本地名称。为什么?
我怀疑 update_myself!
正如您所写的那样,它在任何情况下都有效。您确定这只是工作失败而不是其他地方吗?我怀疑您的测试存在问题,导致您出现误报。
您在 Ruby 本身遇到了一个常见问题;这不是特定于 ActiveJob 甚至 Rails.
基本上,当Ruby看到这个:
thisis_a_column = newvalue
它假定您要声明一个新的、局部范围的变量,名为 thisis_a_column
。
如果你想给 ActiveRecord 管理的列赋值,这是一个实例级方法,你必须显式使用self
,像这样:
self.thisis_a_column = newvalue
另请参阅:
完全有可能我做错了什么但是!
这是故事。我有一个标准的初学者级别的 RoR 设置 (4.2) 和 ActiveJob 作业。
我的一项工作对传入的记录调用一个方法,目的是修改该记录。到目前为止很正常。它看起来像这样:
class GenericScraperJob < ActiveJob::Base
def perform(record)
# perform job with record data
record.update_myself!
end
end
然后 update_myself!
方法如下所示:
class RecordInDb < ActiveRecord::Base
def update_myself!
thisis_a_column = newvalue
self.save!
end
end
神秘之处在于 - 当我 运行 测试并检查 fixture_instance.thisis_a_column
是否为 newvalue
时,测试通过。当我启动我的应用程序并查看数据库中发生的情况时,它未按预期更新。
但是如果我说 self.thisis_a_column = newvalue
,那么它在任何地方都可以正常工作。
我确定我重新加载了我的夹具...我是这样做的:fixture_instance = RecordinDb.find(fixture_inst.id)
就好像 ActiveRecord 实例内部的绑定发生了变化,这取决于它被实例化的时间。在我的测试中,符号似乎被视为可能发送到 self
的消息,但在工作中,它们被视为本地名称。为什么?
我怀疑 update_myself!
正如您所写的那样,它在任何情况下都有效。您确定这只是工作失败而不是其他地方吗?我怀疑您的测试存在问题,导致您出现误报。
您在 Ruby 本身遇到了一个常见问题;这不是特定于 ActiveJob 甚至 Rails.
基本上,当Ruby看到这个:
thisis_a_column = newvalue
它假定您要声明一个新的、局部范围的变量,名为 thisis_a_column
。
如果你想给 ActiveRecord 管理的列赋值,这是一个实例级方法,你必须显式使用self
,像这样:
self.thisis_a_column = newvalue
另请参阅: