フォアグラウンドで時間がかかるため、バックグラウンドでメッセージのコレクションをマークする必要があります (delayed_job gem を使用しています)。だから私はActiveJob
クラスを作成し、それと変数MarkMessagesAsReadJob
を渡してuser
、すべての読み取りをマークしました。messages
messages
user
// passing the values in the controller
@messages = @conversation.messages
MarkMessagesAsReadJob.perform_later(current_user, @messages)
私の ActiveJob クラスでは、タスクを実行します。
// MarkMessagesAsReadJob.rb
class MarkMessagesAsReadJob < ActiveJob::Base
queue_as :default
def perform(user, messages)
messages.mark_as_read! :all, :for => user
end
end
ただし、タスクを実行しようとすると、エラー ActiveJob::SerializationError (Unsupported argument type: ActiveRecord::Associations::CollectionProxy) が発生しました:
サポートされている型のみを ActiveJob に渡すことができると読みましたが、CollectionProxy オブジェクトをシリアル化できないと思います。これを回避/修正するにはどうすればよいですか?
PS:考えました
@messages.map { |message| MarkMessagesAsReadJob.perform_later(current_user, message) }
しかし、それらを1つずつマークするのはかなり高価だと思います。