我完全有可能做错了,但是!
这是故事。我有一个标准的,初学者级别的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
的消息,但在作业中,它们被视为本地名称。为什么呢?
答案 0 :(得分:0)
我怀疑onDataChanged
正如你所写,它可以在任何情况下使用。你确定这只是失败的工作而不是其他地方吗?我怀疑你的测试存在问题导致误报。
你在Ruby本身遇到了一个常见的陷阱;这不是特定于ActiveJob甚至是Rails。
基本上,当Ruby看到这个时:
update_myself!
它假定您声明一个名为thisis_a_column = newvalue
的新的本地范围变量。
如果要为ActiveRecord管理的列分配值(实例级方法),必须明确使用thisis_a_column
,如下所示:
self