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

时间:2018-03-24 03:23:50

标签: ruby-on-rails code-structure

我有几个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

有没有更好的方法来构建这个?

1 个答案:

答案 0 :(得分:2)

如果你想继续使用回调,那么你可以传递一个块来执行<main>方法为你做的事情,这样你就不需要写出那个方法,因为它提供给你很少但只是回调的手柄。

Message#deliver_message_job

如果您想摆脱class Message < ApplicationRecord after_create { |msg| DeliverMessageJob.perform_later(msg.id) } # . . . end 方法,那么也许您可以将用于传递消息的逻辑放入Message#deliver_message。这可能在语义上更有意义,因为它的目的显然只是传递信息。

DeliverMessageJob#perform

值得问自己&#34;消息是否应该知道如何实现自我?&#34;答案可能是&#34;不,它不应该&#34;#34;或者&#34;它不重要&#34;,在这种情况下,让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 担心细节。通过这种方式,您已从DeliverMessageJob模型中删除了一些方法并将其缩小了一些,使您的类更整洁,更简单。