当前位置: 首页 > 知识库问答 >
问题:

Rails:在模型中指定不同的数据库

颜文昌
2023-03-14

我正在尝试设置Rails(v3.2.2)以使用多个数据库。我这样做是基于这个将Rails 3.1与多个数据库连接起来。

我的型号:

class Category < ActiveRecord::Base                                                                                                                                                                                                                                                                                                
  establish_connection :category_database                                                                                                                                                                                                                                                                                                                       
  self.primary_key = "cat_id"                                                                                                                                                   

  validates_presence_of :name, :display_name, :description, :icon, :image, :parent_category_id, :create_time                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
end

database.yml:

category_database:                                                                                                                                                              
  adapter: mysql2                                                                                                                                                               
  encoding: utf8                                                                                                                                                                
  reconnect: false                                                                                                                                                              
  database: main_cat                                                                                                                                                         
  pool: 5                                                                                                                                                                       
  username: root                                                                                                                                                                
  password: blah                                                                                                                                                                    
  socket: /var/run/mysqld/mysqld.sock

当我运行这个规范文件时:

require 'spec_helper'                                                                                                                                                           

describe Category do                                                                                                                                                            
  puts "ENV: #{Rails.env}"                                                                                                                                                      
  it { should validate_presence_of :name }                                                                                                                                      
  it { should validate_presence_of :display_name }                                                                                                                              
  it { should validate_presence_of :description }                                                                                                                               
  it { should validate_presence_of :icon }                                                                                                                                      
  it { should validate_presence_of :image }                                                                                                                                     
  it { should validate_presence_of :parent_category_id }                                                                                                                        
  it { should validate_presence_of :create_time }                                                                                                                               

end            

像这样:

>rspec /path/to/category_spec.rb  

我明白了:

/home/user/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:45:in `resolve_hash_connection': database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified)

我也尝试过像这样设置establish_connection:

  establish_connection(                                                                                                                                                         
    :adapter => "mysql2",                                                                                                                                                       
    :encoding => "utf8",                                                                                                                                                        
    :reconnect => false,                                                                                                                                                      
    :database => "main_cat",                                                                                                                                                 
    :pool => 5,                                                                                                                                                                 
    :username => "root",                                                                                                                                                        
    :password => "blah",                                                                                                                                                            
    :socket => "/var/run/mysqld/mysqld.sock")

这导致了相同的异常。(适配器未指定)

奇怪的是,如果我完全放弃establish_connection,通过database.yml文件应用完全相同的连接配置,如下所示:

test:                                                                                                                                                                           
  adapter: mysql2                                                                                                                                                               
  encoding: utf8                                                                                                                                                                
  reconnect: false                                                                                                                                                              
  database: main_cat                                                                                                                                                         
  pool: 5                                                                                                                                                                       
  username: root                                                                                                                                                                
  password: blah                                                                                                                                                                    
  socket: /var/run/mysqld/mysqld.sock   

它的工作原理。

Rails似乎完全忽略了establish_connection……我是不是缺少了一些应用程序级的配置设置?如何让Rails识别establish_connection,以便在不同的数据库中放置不同的模型?

非常感谢!

共有2个答案

空英达
2023-03-14

由于几乎相同的原因,我遇到了同样的错误,但是我确实在我的database.yml中进行了测试:配置;但是问题在于我在模型定义中配置了“建立连接”方法:

  establish_connection 'cm_inv_mgmt_' + Rails.env.downcase

虽然我为生产/暂存和开发环境提供了database.yml的各个部分,但是我缺少cm_inv_mgmt_test!

羊舌庆
2023-03-14

因此,Rails需要默认配置。在本例中,数据库。yml文件仍然需要一个测试数据库。否则,Rails将抛出一个异常,因为它希望在初始化模型之前建立一些连接。一旦加载了默认配置,Rails稍后会继续初始化模型,然后可以通过建立连接进行模型级数据库配置。

我希望这对其他人有所帮助。我花了相当多的时间运行调试器。

ActiveRecle-3.2.2/lib/active_record/connection_adapters/摘要/connection_specification.rb

来解决这个问题。

 类似资料:
  • 本文向大家介绍Django 在代码中指定不同的数据库,包括了Django 在代码中指定不同的数据库的使用技巧和注意事项,需要的朋友参考一下 示例 普通方法将使用默认数据库,或者,如果使用数据库路由器,它将使用中指定的数据库。您可以使用以下方法覆盖它:obj.save()db_for_write 同样,为了阅读:            

  • 是否有一种方法可以从S3中自动化这个加载过程,以便表列数据类型可以从CSV文件中推断出来,或者通过其他方式在其他地方指定?(类似于在Google BigQuery中使用推断的表模式从GCS中的csv文件创建表的方式)

  • 问题内容: 我很困惑。如果每页只能使用一次,则如何使用位于不同模块,不同.js文件中的指令。看: 因此,我现在如何指向页面上的secondModule,而无需从mainModule.js引用它 问题答案: 有一种解决方案,可以以编程方式在页面上引导几个角度模块(docs)。 您必须从html中删除属性。 定义几个模块: 然后在index.html中执行: 这是使用此解决方案的有效plnkr。

  • 问题内容: 我想在3个地方使用相同的HTML模板,只是每次使用不同的模型。我知道我可以从模板访问变量,但是名称会有所不同。 有没有办法将模型传递给ngInclude? 这是我想要实现的,当然add-variable属性现在不起作用。然后,在我包含的模板中,我将访问detailsObject及其属性。 如果我使用ng-include的方法不好,还有其他应该尝试的方法吗? 问题答案: 注意:这不是我的

  • 我正在使用Rcpp和另一个第三方C库开发一个包。当我试图安装包时,我得到了 在32位Windows操作系统中,根据我同事的建议,我通过将以下DLL的位置从MingW添加到系统路径,解决了这个问题。 但64位Windows,我得到相同的错误,即使与dll虽然我使用32位R。 所以我的问题是: 有没有办法知道为什么错误发生?我是说我想知道哪个模块不见了。也许冗长的选项在哪里?