我需要在后台标记一组消息(我正在使用delay_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(不支持的参数类型: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: ids)
messages.mark_as_read! :all, :for => user
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句