Ruby on rails 使用延迟作业递增

Ruby on rails 使用延迟作业递增,ruby-on-rails,ruby-on-rails-3,delayed-job,increment,Ruby On Rails,Ruby On Rails 3,Delayed Job,Increment,每当创建投资时,我试图将列(yest\u Holder\u count)的增量延迟一天,以便记录一天前在风险投资中进行投资的用户数(因此,我可以使用这些数据生成跟踪投资者数量的图表) 我认为最简单的方法是使用延迟的\u作业,但这不起作用。延迟的\u作业是在一个单独的表中创建的,根据SQLite DB浏览器,它会在一天后运行。但“是的股东计数”列不会增加。 Venture型号: def yest_increment self.increment!(:yest_shareholde

每当创建
投资时,我试图将列(
yest\u Holder\u count
)的增量延迟一天,以便记录一天前在
风险投资中进行
投资的用户数(因此,我可以使用这些数据生成跟踪投资者数量的图表)

我认为最简单的方法是使用
延迟的\u作业
,但这不起作用。延迟的\u作业是在一个单独的表中创建的,根据SQLite DB浏览器,它会在一天后运行。但“是的股东计数”列不会增加。

Venture
型号:

  def yest_increment
       self.increment!(:yest_shareholder_count)
  end
  handle_asynchronously :yest_increment, :run_at => Proc.new {1.minute.from_now}
投资
控制器:

  def create
    @venture = Venture.find(params[:share_id])

    @venture_increment= @venture.increment(:shareholder_count)
    @venture_yest_increment= @venture.yest_increment

    @investment = current_user.invest!(@venture)

    if @venture_increment.save and @venture_yest_increment.save
    respond_to do |format|
        format.html {redirect_to @venture}
            end
    end

  end
直接增量按其应发生的方式发生,但延迟增量永远不会发生

以下是delayed_jobs表中“handler”列的内容,以防有用:

--- !ruby/struct:Delayed::PerformableMethod 
object: !ruby/ActiveRecord:Venture
  attributes: 
    created_at: 2011-06-21 07:00:12.252808
    onemth_shareholder_count: 0
    updated_at: 2011-08-09 16:50:36.864354
    onewk_shareholder_count: 0
    shareholder_count: 4
    id: 49
    user_id: 40
    yest_shareholder_count: 0
method_name: :yest_increment_without_delay
args: []
我不知道“没有延迟的是的增量”是从哪里来的,或者为什么“args”是空的

非常感谢您的帮助


编辑:我使用“1.minute.from\u now”而不是“1.day.from\u now”来测试代码。

当您定义一个使用延迟作业异步处理的方法时,延迟作业会创建一个别名方法链(我不太熟悉)。它会导致调用由延迟作业处理的原始方法名称,当延迟作业到达该方法时,它会在没有延迟的情况下调用原始方法名称,即别名为的实际对象方法

没有参数,因为您没有将任何参数传递给
yest\u increment
。如果将任何参数传递给
yest\u increment
,它们将与作业一起保存,以便在延迟作业调用时传递给实际方法

表中的对象是对象的序列化版本,delayed_作业存储在db中。当作业需要运行时,它将通过反序列化创建一个对象,并使用给定参数调用该方法。由于该对象是ActiveRecord对象,反序列化包括从序列化对象检索id和从da查找对象塔巴斯

根据您的实际问题,它不起作用,不清楚什么不起作用。延迟的作业没有被调用,或者值没有增加,或者延迟的作业调用得太快。如果是最后一个,将代码更改为以下代码可能会有所帮助:

handle_asynchronously :yest_increment, :run_at => Proc.new {Time.now.beginning_of_day + 1.day}

谢谢你的回答。问题是该值没有增加。应该返回什么?它不会返回,因为延迟的作业将拦截调用而不调用该方法。从控制台无延迟地调用
yest\u increment\u
正确吗?yest\u increment应该是增加的将yest_Holder_count列增加1,但一天后。您是否直接检查调用
yest_increment_而不延迟
以查看增量是否有效?我询问了方法的返回值,因为行
if@venture_increment.save和@venture_yest_increment.save