0

我完全有可能做错了什么,但是!

这是故事。我有一个标准的初学者级别的 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但在工作中,它们被视为本地名称。为什么?

4

1 回答 1

0

我怀疑update_myself!正如您所写的那样,它在任何情况下都有效。你确定它只是在工作中失败而不是在其他地方吗?我怀疑您的测试存在问题,导致您出现误报。

您在 Ruby 本身中遇到了一个常见的问题;这不是特定于 ActiveJob 甚至 Rails 的。

基本上,当 Ruby 看到这个时:

thisis_a_column = newvalue

它假定您正在声明一个新的、局部范围的变量,名为thisis_a_column.

如果要为 ActiveRecord 管理的列分配值,这是一个实例级方法,则必须显式使用self,如下所示:

self.thisis_a_column = newvalue

另请参阅:https ://stackoverflow.com/a/17991720/4625365

于 2015-07-01T21:53:31.623 回答