【问题标题】:Accessing a database through Rails model from a seperate Ruby script从单独的 Ruby 脚本通过 Rails 模型访问数据库
【发布时间】:2015-10-17 12:10:40
【问题描述】:

我有一个带有数据库的 Rails 应用程序(使用 ActiveRecord 的 PostgreSQL)

在同一台服务器上的一个单独目录中,我有一个 Ruby 脚本。

如何从 Ruby 脚本通过我的 Rails 模型之一访问 Rails 数据库?


我已经看到可能需要 ActiveRecord 并传入数据库详细信息,但据我了解,我需要重建模型,这意味着需要大量重复验证、方法等。相反,我会喜欢以某种方式使用已经存在的模型。

【问题讨论】:

  • 为什么不使用 rake 任务?
  • 以什么方式?据我了解,rake 任务存在于 Rails 应用程序中,位于 lib/tasks 下。我的 Ruby 脚本完全独立于 Rails 应用程序。
  • 确实如此,但您正在尝试与 rails 应用程序交互。所以我会使用 rake 任务
  • 这是一次性任务吗?还是您必须更频繁地解决这个问题?到目前为止,mentionend 目录中的 rake 任务是最简单的方法。如果您想将您的任务与您的应用程序分开,请创建一个仅包含您的模型的 Rails 引擎,并从您的应用程序和脚本中要求它。

标签: ruby-on-rails ruby


【解决方案1】:

尝试使用 rails runner。根据:http://guides.rubyonrails.org/command_line.html#rails-runner

runner 在 Rails 上下文中以非交互方式运行 Ruby 代码。为了 实例:

bin/rails runner "Model.long_running_method"

根据我的经验,这可以很好地运行依赖于 Active Record 等的脚本。

在命令中添加 -e 开关以强制使用您的生产数据库连接:

bin/rails runner -e staging "Model.long_running_method" 

添加完成数据库连接可能需要的任何其他环境变量。如果您使用 Devise gem,您还需要传递一个秘密以允许 Devise 初始化完成。其他宝石可能同样需要一些帮助才能开始。

【讨论】:

    【解决方案2】:

    我找到了一个具有我正在寻找的行为的解决方案,并将其发布为以后遇到此问题的任何人的答案。

    在 Ruby 脚本中设置ENV['RAILS_ENV'] = "production",然后简单地要求environment.rb 文件(具有适当的路径)可以很好地解决问题。

    这类似于@MurifoX 提供的答案,但您不必重新声明数据库连接。

    【讨论】:

      【解决方案3】:

      您可以使用require 将相对路径传递给您的模型,然后将其实例化。

      require '/path/to/your/model/inside/your/app'
      
      model = Model.new 
      

      对于连接,如果您使用的是postgresql,您可以像这样使用pg gem 中的PGconn 类:

      @connection = PGconn.open(
        :user => 'postgres', 
        :password => 'password', 
        :host => 'host', 
        :dbname => 'dbname')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多