基于GlobalID的ActiveRecord对象的行为是否存在问题?

时间:2015-07-01 19:41:09

标签: ruby-on-rails rails-activerecord rails-activejob

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

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

1 个答案:

答案 0 :(得分:0)

我怀疑onDataChanged正如你所写,它可以在任何情况下使用。你确定这只是失败的工作而不是其他地方吗?我怀疑你的测试存在问题导致误报。

你在Ruby本身遇到了一个常见的陷阱;这不是特定于ActiveJob甚至是Rails。

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

update_myself!

它假定您声明一个名为thisis_a_column = newvalue 的新的本地范围变量。

如果要为ActiveRecord管理的列分配值(实例级方法),必须明确使用thisis_a_column,如下所示:

self

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