0

我有几个模型需要调用一个将特定哈希作为输入的方法。我应该在哪里声明这个哈希以保持干燥,然后我如何在多个模型中使用它?

所有用途的哈希值都是相同的。具体来说,它只是我想传递给调用建立连接的连接详细信息的散列。我意识到该方法需要一个 URL,尽管我仍在使用 rails 3.1,并且该方法直到稍后才可用。

我不想在五个模型中重复以下内容,我只想调用类似 establish_connection(legacy_db_connection_hash).

establish_connection(
  :adapter  => 'mysql',
  :host     => ENV['LEGACY_DATABASE_HOST'],
  :username => ENV['LEGACY_DATABASE_USERNAME'],
  :password => ENV['LEGACY_DATABASE_PASSWORD'],
  :database => ENV['LEGACY_DATABASE_NAME']
)

我在想也许有办法通过/lib,但我真的不知道该怎么做。

感谢您的时间!

4

3 回答 3

2

您还可以在 application.rb 文件中声明配置

模块 Yourapp
  类应用程序 < Rails::应用程序

    config.db_connection_config = {
     ......
    }

  结尾
结尾

你可以使用它Yourapp::Application.config.db_connection_config 如果需要,你也可以在单独的环境文件中修改它们。

并且可能不是使用建立连接每个时间,您可以在 lib 模块中放入一个单独的模块,就像它在上一个答案中建议的那样。

于 2012-06-13T19:21:26.507 回答
1

它应该进入一个module.

例如,Foo在文件中声明一个模块lib/foo.rb(不要忘记self.在方法名前面):

module Foo
  # returns a hash of connection settings
  def self.settings
    {
      adapter: 'mysql2',
      database: ENV['LEGACY_DATABASE_NAME'],
      username: ENV['LEGACY_DATABASE_USERNAME'],
      password: ENV['LEGACY_DATABASE_PASSWORD'],
      host:     ENV['LEGACY_DATABASE_HOST']
    }
  end
end

Foo.settingsinclude Foo当您在您的模型中时将可用。

此外,请确保将lib目录添加到config.autoload_pathsin config/application.rb,以便lib/foo.rb读取并Foo加载其包含的模块:

config.autoload_paths += %W(#{config.root}/lib)
于 2012-06-13T19:17:08.347 回答
1

这是我的做法:

配置/初始化程序/profile_store.rb

config = YAML.load_file('config/profile_store.yml')[Rails.env]
Rails.application.config.profile_store = config.symbolize_keys

配置/profile_store.yml

development:
  host: localhost
  prefix: dev-profile

test:
  host: localhost
  prefix: test-profile

您稍后可以访问它,Rails.application.config.profile_store并且在开发中您将获得

{:host => 'localhost', :prefix => 'dev-profile'}
于 2012-06-13T19:40:52.897 回答