我有几个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
有没有更好的方法来构建这个?
答案 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
模型中删除了一些方法并将其缩小了一些,使您的类更整洁,更简单。