【问题标题】:How to call app Model in initializers with Ruby on Rails如何使用 Ruby on Rails 在初始化程序中调用应用程序模型
【发布时间】:2014-03-27 06:38:44
【问题描述】:

我是 Ruby on Rails 的新手,我正在使用 Ruby 版本 2.1.0 和 Rails 4.0.2

我的查询是:-

我想在 initializers 中调用 Model

我的 Model 文件是 setting.rbModel 名称 Setting。它的位置是 app/model 目录。

我想在 initializers 文件 paypal.rb 中调用 Setting Model

paypal.rb 位置是 config/initializers/paypal.rb

请帮助如何在 Ruby on Railsinitializers 中调用 Model

【问题讨论】:

  • 请分享您编写的代码,并告诉我们您尝试时遇到的错误。
  • 请像@TarynEast 所说的那样分享您的代码 - 另外,如果您尝试在paypal.rb 文件的顶部添加require models/setting 会发生什么?

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


【解决方案1】:

在运行这个初始化程序之前,您想确保所有其他初始化程序都已运行吗?如果是这样,您可以这样做:

# config/initializers/paypal.rb
Rails.configuration.after_initialize do
  paypal_settings = Setting.find_by(name: "paypal")
  # do something with paypal settings...
end

【讨论】:

  • 我不是 OP,但我遇到了同样的问题,我得到了以下错误(在我的情况下是 User 而不是 Setting):/usr/local/lib /ruby/gems/2.7.0/gems/activerecord-6.0.3.1/lib/active_record/dynamic_matchers.rb:22:in method_missing': undefined method attr_accessible' 用于用户(调用'User.connection'建立连接):类(无方法错误)。我将调查它是否必须处理丢失的数据库连接,否则您还有其他见解吗?
  • 别管我上面说的,我解决了我的问题:stackoverflow.com/questions/23437830/…
【解决方案2】:

为了解决这个问题,我这样做了:

  1. 首先我检查表是否存在。
  2. 然后我检查我的记录是否存在。
  3. 否则我只是设置一个默认值。

这是一种 hack,但它适用于我的用例。

if ActiveRecord::Base.connection.table_exists? :settings # check if table exists
  if Setting.first.present? # check if first record has been seeded
    NUMBERS = Setting.first.my_numbers.split(",")
  else
    NUMBERS = '987654321'
  end
else
  NUMBERS = '123456789'
end

【讨论】:

    【解决方案3】:

    如果数据库不存在,上述解决方案仍然会在rake db:migraterake db:bootstrap 上失败。在我的情况下,circleCI 上的构建失败了。

    以下解决方案适合我。

    # /app/config/initializers/settings.rb
    db_loaded = ::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
    
    if db_loaded && Setting.table_exists?
    // business logic
    end
    

    【讨论】:

      【解决方案4】:

      在 Rails 中,无论您身在何处,都可以与模型互动。 喜欢

      Setting.method_name()
      

      在 rails 应用程序中,您可以创建自己的新文件夹(除了 rails new 命令创建的默认目录)并可以与 Model 方法进行交互。

      【讨论】:

      • 如果您正在迁移项目,初始化程序会在迁移之前运行。在这种情况下,该表将不存在。
      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2010-10-22
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多