如何正确构建仅调用 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
模型中删除了几个方法并稍微精简了它,并使您的 类 更加整洁和简单。
我有几个 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
模型中删除了几个方法并稍微精简了它,并使您的 类 更加整洁和简单。