gpt4 book ai didi

ruby-on-rails - 无法将 CollectionProxy 对象传递给 ActiveJob

转载 作者:行者123 更新时间:2023-12-04 03:40:12 24 4
gpt4 key购买 nike

我需要在后台标记一组消息(我正在使用 delay_job gem),因为在前台需要一些时间。所以我创建了一个 ActiveJob类(class)MarkMessagesAsReadJob ,并通过了 usermessages变量以标记所有 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()方法,例如:
在 Controller 中:

@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

关于ruby-on-rails - 无法将 CollectionProxy 对象传递给 ActiveJob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32154220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com