Scheduling jobs from a plugin

好久不见——Apparently 5 年了,但据我回忆……

例如,作业代码:

# school-points\jobs\deferred_topic_creation.rb
module Jobs
  class DeferredTopicCreation < Jobs::Base
    def execute(args)
      creator_user_id = args[:creator_user_id]
      custom_fields = {
        event_start: args[:event_start],
        event_end: args[:event_end]
      }

      creator_user = User.find(creator_user_id) || User.find(Discourse::SYSTEM_USER_ID)

      post_creator = PostCreator.new(
        creator_user,
        args.except!(:creator_user_id, :event_start, :event_end)
      )
      post = post_creator.create

      topic = Topic.find(post.topic_id)
      topic.custom_fields = custom_fields
      topic.save!
    end
  end
end

应该在 after_initialize 块中加载。如果不是这样,则无法创建作业。这不会创建主题,而是仅将代码注册为稍后可以入队的作业。

然后,当您实际上想推迟创建主题时(对您而言,是在您的 AJAX 请求之后),您可以执行类似以下操作:

opts = {
  title: title,
  raw: content,
  category: child_category[:id],
  creator_user_id: creator_user_id,
  event_start: event_start.to_time.to_i,
  event_end: event_end.to_time.to_i
}
Jobs.enqueue(:deferred_topic_creation, opts)

希望这能让事情更清楚。