2

我有一个标准系统,用于对各种数据集执行计算。很棒的是我可以将这些计算作为 Proc 传递给 perform 方法。这是我想要完成的事情:

class Calculator
    include Sidekiq::Worker

    def perform rails_model , rails_model_id
         obj = Kernel.const_get( rails_model ).find( rails_model_id )
         yield( obj )
    end
end

Calculator.perform_asyc( "User" , 123 , { |u| u.do_something } )

这种事情是可能的还是不好的做法?我知道直接发送对象是不好的做法,所以我假设发送块也是一个坏主意?

4

2 回答 2

5

这是不可能的。Ruby 中的代码没有序列化格式,只有数据。

于 2013-02-03T23:02:15.150 回答
3

实际上,您可以实现这一点。我需要一个工作人员对记录集合执行一些操作,但我希望能够灵活地更改模型上的查询,以便在需要时返回不同的集合。

class MyWorker
  include Sidekiq::Worker

  def perfom(scoping_query)
    MyModel.class_eval(scoping_query).call.find_each do |m|
     # do stuff...
    end
  end    
end

MyWorker.perform_async("proc { where(attribute: value) }")

我的解决方案将适用于您的示例。

class Calculator
  include Sidekiq::Worker

  def perform(klass, id, code_block)
    obj = klass.constantize.find(id)
    klass.constantize.class_eval(code_block).call(obj)
  end
end

Calculator.perform_asyc("User", 123, "proc { |u| u.do_something }")

如您所见,诀窍是将块作为字符串发送,然后在返回 Proc 的类的范围内评估该字符串,然后您可以调用它。

于 2016-12-08T21:35:39.623 回答