2013-01-31 76 views
1

我有一個用於在不同數據集上執行計算的標準系統。最好的是我可以將這些計算作爲Proc傳遞給執行方法。這是我想要實現的:是否可以將Blocks或Procs作爲參數發送到Sidekiq?

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 }) 

這種事情是可能的還是不好的做法?我知道直接發送對象是不好的做法,所以我假設發送塊也是一個壞主意?

+1

我不知道,如果你能做到這一點或沒有,但而不是使用內核模塊,你爲什麼不: 'rails_model.constantize.find(rails_model_id)' 我希望傳遞塊不應該是Sidekiq的問題。 –

+1

Sidekiq在獨立機器上的單獨進程中運行代碼。傳遞塊會有問題。 – yfeldblum

回答

4

這是不可能的。 Ruby中的代碼沒有序列化格式,僅用於數據。

1

其實你可以做到這一點。我需要一名工作人員對一組記錄執行一些操作,但我希望能夠靈活地改變模型上的查詢,以便在需要時返回不同的集合。

​​

我的解決方案適用於您的例子。

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類的範圍是字符串,然後你可以調用它。

相關問題