基于 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

另请参阅: