无法将 CollectionProxy 对象传递给 ActiveJob

2023-12-22

我需要在后台标记一组消息(我正在使用delayed_job gem),因为它在前台需要一些时间。所以我创建了一个ActiveJob class MarkMessagesAsReadJob,并通过了user and 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(不支持的参数类型:ActiveRecord::Associations::CollectionProxy):

我读到我们只能将支持的类型传递给 ActiveJob,并且我认为它无法序列化 CollectionProxy 对象。我该如何解决/解决这个问题?

PS:我考虑过

@messages.map { |message| MarkMessagesAsReadJob.perform_later(current_user, message) } 

不过我认为一一标记它们是相当昂贵的。


我认为简单的方法是将消息 ID 传递给perform_later()方法,例如:

在控制器中:

@messages = @conversation.messages
message_ids = @messages.pluck(:id)
MarkMessagesAsReadJob.perform_later(current_user, message_ids) 

并用在ActiveJob:

def perform(user, message_ids)
  messages = Message.where(id: message_ids)
  messages.mark_as_read! :all, :for => user
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法将 CollectionProxy 对象传递给 ActiveJob 的相关文章

随机推荐