背景
我目前正在开发一个需要访问和处理外部 API 的小型 Rails 5 项目。 API 有一个 ruby 包装器 gem,因此访问数据不是问题。
问题描述
我目前缺少等式的两个部分,希望有人能帮助我。
1:我需要每 15 分钟通过 Rails 调用一次 API。我怎样才能意识到这一点?为此,我一直在寻找 Active Job,但由于没有得到有用的结果,我的研究有点停滞了。
2:外部 API 与我的应用程序具有不同的领域模型和不同的领域特定语言。如何在不更改 Active Record 的情况下映射不同的模型?
最佳答案
1: I need to call the API, via Rails, every 15 minutes. How can I realize this? I was looking towards Active Job for this, but my research kind of stalled after getting no useful results.
您可以使用循环任务解决的第一个问题。主要思想是运行将每 x 分钟(或天或任何适合您的问题的任何时间)执行一些操作的过程。
您可以使用多种工具。其中一个是unix系统内置的,它是cron。 .您可以在系统手册中阅读它。您可以使用 whenever gem 轻松管理它.主要缺点是您需要访问系统的 cron,这在非裸机(例如 Heroku 等平台即服务主机)上可能很重要。
您还应该看看 clockwork它不依赖于系统的 cron。它使用的方法让您有一个始终运行的单独进程,并密切关注定义的任务。
在第二种方法(有一个单独的进程)中,您需要记住,耗时的指令可能会“锁定”进程并推迟其他任务。在这种情况下,您可能希望使用后台处理,例如 sidekiq或 delayed_job .这个想法是使用一个进程在特定时间安排任务,并在任务出现在队列中时使用另一个进程来处理这些任务。
2: The external API has different domain models and a different domain-specific language than my application. How can I map the different models without changes in Active Record?
您需要创建一个客户端来使用 API 并将其响应映射到应用程序中的模型中。这样,您就不需要使模型的方案依赖于 API 方案。看看resource_kit gem - 这是一个使用这种方法的示例解决方案。
关于ruby-on-rails - 基于间隔的API访问和处理不同的DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39821668/