2015-02-08 35 views
1

我需要在活動作業計劃在稍後執行時使用時存儲信息。我想將這些信息保存在活動作業本身中,但我不確定這是否可行。將數據存儲在作業中以供執行時使用

這裏有我想要的簡化版本,它再現了一個錯誤我看到:

class TestJob < ActiveJob::Base 
    queue_as :default 

    attr_reader :save_for_later 

    def initialize(info) 
    @save_for_later = info 
    end 


    def perform() 
    logger.info(@save_for_later) 
    end 
end 

class CollectionsController < ApplicationController 
    def schedule_test_job 
    TestJob.perform_later(Date.new) 
    end 
end 

當我打電話schedule_test_job在集合控制器,我得到一個錯誤: 未定義的方法'地圖」的無:NilClass 並且不執行執行操作。

我假設我需要堅持信息我試圖保存在我的數據庫中的其他地方,但我想知道是否有一個正確的方法來完成我在這裏做的。我也不明白拋出的錯誤來自哪裏。

+0

你從哪裏得到那個錯誤?這可能是因爲你不應該重寫intialize,因爲它也會做一些其他的事情。您可以傳遞日期作爲工作參數,因爲它將被保留,但將其作爲數字傳遞,因爲ActiveJob只接受基本類型(可以輕鬆地序列化/反序列化)。你可以使用'i = Time.current.to_i'和'Time.at(i)' – bcd 2015-02-08 21:38:51

+0

@bcd當控制器中的函數'schedule_test_job'被調用時發生錯誤。關於初始化需要做其他事情的問題,如果我在初始化塊的末尾添加對super()的調用,這個錯誤會消失。 – Will 2015-02-09 04:28:05

回答

0

其實所有的工作參數傳遞給perform,所以你必須寫:

class TestJob < ActiveJob::Base 
    def perform(date) 
    logger.info(date) 
    end 
end 

TestJob.perform_later(Date.new) 

的第二個問題是,Date不AFAIK通過ActiveJob序列化。但是你可以很容易地傳遞一個字符串,然後解析日期;)

相關問題