【问题标题】:Is there a gotcha in the behavior of GlobalID based ActiveRecord objects?基于 GlobalID 的 ActiveRecord 对象的行为是否存在问题?
【发布时间】:2015-07-01 19:41:08
【问题描述】:

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

故事是这样的。我有一个标准的初学者级别的 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_columnnewvalue 时,测试通过了。当我启动我的应用程序并查看数据库中发生的情况时,它没有按预期更新。

但是如果我说self.thisis_a_column = newvalue,那么它在任何地方都能正常工作。

我确定我重新加载了我的夹具...我是这样做的:fixture_instance = RecordinDb.find(fixture_inst.id)

好像 ActiveRecord 实例中的绑定发生变化,具体取决于实例化的时间。在我的测试中,看起来符号被视为可能发送到self 的消息,但在工作中,它们被视为本地名称。为什么?

【问题讨论】:

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


    【解决方案1】:

    我怀疑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

    【讨论】:

    • 嘎。我没有注意到我输入的是 assert 而不是 assert_equal :( 很抱歉。
    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多