0

sidekiq でアクティブなレコード オブジェクトを作成したいと考えています。オブジェクト全体をシリアル化する必要があるため、ベストプラクティスではないことはわかっていますが、この場合、他に選択肢はありません。

試してみると、次のようになります。

  EventTrackingWorker JID-ec2be02dae626dd19202b17f INFO: start
  EventTrackingWorker JID-ec2be02dae626dd19202b17f INFO: fail: 0.033 sec
  WARN: {"retry"=>false, "queue"=>"default", "class"=>"EventTrackingWorker", "args"=>["shift_created_event", {... long json object ..}}, "create"], "jid"=>"ec2be02dae626dd19202b17f"}
  WARN: undefined method `primary_key' for Hash:Class
  WARN: /Users/jedi/.rbenv/versions/1.9.3-p194-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.11/lib/active_record/reflection.rb:366:in `primary_key'
  /Users/jedi/.rbenv/versions/1.9.3-p194-perf/lib/ruby/gems/1.9.1/gems/activerecord-3.2.11/lib/active_record/reflection.rb:216:in `association_primary_key'

エラーは次のように述べています: WARN: undefined method `primary_key' for Hash:Class

このメソッドで作成されたオブジェクト (この場合はイベント):

Track(:shift_created_event, {eventable: @shift, creator: current_user})

Trackメソッドは次のようになります。

module EventTracking
  module_function

  def Track(event, options, method=:create)
    EventTrackingWorker.perform_async(event, options, method)
  end

end

クラスEventTrackingWorker:

class EventTrackingWorker
  include Sidekiq::Worker

  def perform(event, options, method=:create)
    event.to_s.classify.constantize.new(options).send(method)
  end

end

注:文字列をアクティブなレコード クラスにevent.to_s.classify.constantize.new(options).send(method)変換し、オプションを指定して呼び出します。その後、オブジェクトを作成しますshift_created_eventShiftCreatedEventnew.send(method)

誰かがそれを経験していますか?

4

0 に答える 0