如何正确构建仅调用 rails 中的方法的作业

How to properly structure jobs that only call methods in rails

我有几个 after_create 方法(主要用于在平台上发送电子邮件或消息),它们调用最终调用方法的作业,但我的代码开始像这样构造,看起来并不像不错

class Message < ApplicationRecord
  after_create: :deliver_message_job

  def deliver_message_job
    DeliverMessageJob.perform_later self.id
  end

  def deliver_message
    # logic to deliver message
  end
end

而在工作中,我只是调用方法

class DeliverMessageJob < ApplicationJob
 queue_as :default

 def perform(message_id)
  Message.find(message_id).deliver_message
 end
end

有没有更好的方法来构建它?

如果你想继续使用回调,那么你可以传递一个块来完成 Message#deliver_message_job 方法为你做的事情,这样你就不需要写出那个方法,因为它为你提供了只不过是回调的句柄。

class Message < ApplicationRecord
  after_create { |msg| DeliverMessageJob.perform_later(msg.id) }

  # . . .
end

如果您想摆脱 Message#deliver_message 方法,那么也许您可以将传递消息的逻辑放入 DeliverMessageJob#perform 中。这在语义上可能更有意义,因为它的目的显然只是传递消息。

class DeliverMessageJob < ApplicationJob
  queue_as :default

  def perform(message_id)
    message = Message.find(message_id)
    # Copy over/refactor the Message#deliver_message logic.
    # Do some stuff with the message to deliver it . . .
  end
end

值得问问自己 "Should a message know how to deliver itself?" 答案可能是 "No, it shouldn't" 或 "It's not important",在这种情况下让 DeliverMessageJob 担心细节。通过这种方式,您已经从 Message 模型中删除了几个方法并稍微精简了它,并使您的 类 更加整洁和简单。