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 に答える