【问题标题】:Run Rails commands outside of console在控制台之外运行 Rails 命令
【发布时间】:2012-06-21 22:40:31
【问题描述】:

对于我的大型应用程序,Rails 控制台需要一段时间才能加载。有没有办法更轻松地单个命令?

我还希望能够自动化一些东西,echo "query" | rails console 不是一个很好的做事方式。

想法?

编辑:我可以在需要时对查询执行 ping 操作的长时间运行的进程怎么样?

【问题讨论】:

  • 我很好奇你的用例是什么,因为似乎有更好的解决方案。
  • 我正在使用 Geckoboard 从正在运行的应用程序中获取统计信息,使用 JSON 提要我正在设置这些查询...我做错了吗?
  • 将这段代码直接构建到您的应用程序中并通过 HTTP 获取数据可能更有意义。如果是敏感信息,则需要某种授权,例如带有请求的 API 密钥。
  • 很遗憾,我对 Rails 没有太多经验。我不知道如何在页面中构建像User.all.count 这样的查询并获取结果。我该怎么做?
  • 如果您尝试制作 JSON 提要,那么您只需将其生成为 JSON。关于如何使用 Rails 发送 JSON 响应的资源很多。

标签: ruby-on-rails ruby ruby-on-rails-3 console


【解决方案1】:

在控制台外运行命令主要有两种方式:

  1. 依赖于 :environment 的 Rake 任务

  2. rails runner(以前是 script/runner),例如:

    $ rails runner "query"
    

两者都在 Rails 指南中有很好的记录:https://guides.rubyonrails.org/command_line.html#bin-rails-runner

顺便说一句:这两种方法仍然需要与控制台相同的时间来启动,但它们对于非交互式任务很有用。

【讨论】:

    【解决方案2】:

    只需通过管道输入:

    echo 'puts Article.count' | bundle exec rails c
    

    由于Spring,现在应该比最初提出问题时快很多。这不是立即的,但仍然比启动整个应用程序快得多。将此用于快速通道,它应该在一秒钟内运行(假设您所需的命令很快):

    echo 'puts Article.count' | spring rails c
    

    如果您真的想要一个长时间运行的进程,您可以轻松地通过创建一个控制器操作来轻松地做到这一点,该操作只需运行您发布给它的任何内容,然后使用别名后面的 curl 向它发送命令。该操作当然是完全不安全的,应该三重防范,以防止在生产附近的任何地方运行,但它很容易设置。

    【讨论】:

    • 天才!!顺便说一句,如果您尝试返回“失败退出代码”,请使用abort。例如:echo 'abort' | bundle exec rails c && echo 'Success!' 不会在控制台中显示Success!,而echo 'exit' | bundle exec rails c && echo 'Success!' 将显示Success!