在Rails模型中使用多个PostgreSQL模式

我有一个PostgreSQL数据库为我的Rails应用程序。 在名为“public”的模式中,存储了主要的Rails模型表等等。我创build了一个“discogs”模式,其中有一些名称有时与“public”模式相同的表 – 这就是我正在使用模式来组织这个。

如何在我的应用程序中从“discogs”模式设置模型? 我将使用太阳黑子来让Solr索引这些模型。 我不确定你会如何做到这一点。

database.yml中的PostgreSQL适配器schema_search_path是否可以解决您的问题?

development: adapter: postgresql encoding: utf-8 database: solidus host: 127.0.0.1 port: 5432 username: postgres password: postgres schema_search_path: "discogs,public" 

或者,您可以为每个模式指定不同的连接:

 public_schema: adapter: postgresql encoding: utf-8 database: solidus host: 127.0.0.1 port: 5432 username: postgres password: postgres schema_search_path: "public" discogs_schema: adapter: postgresql encoding: utf-8 database: solidus host: 127.0.0.1 port: 5432 username: postgres password: postgres schema_search_path: "discogs" 

在定义每个连接之后,创build两个模型:

 class PublicSchema < ActiveRecord::Base self.abstract_class = true establish_connection :public_schema end class DiscoGsSchema < ActiveRecord::Base self.abstract_class = true establish_connection :discogs_schema end 

而且,所有模型都从相应的模式inheritance:

 class MyModelFromPublic < PublicSchema set_table_name :my_table_name end class MyOtherModelFromDiscoGs < DiscoGsSchema set_table_name :disco end 

我希望它有帮助。

做就是了

 class Foo < ActiveRecord::Base set_table_name 'myschema.foo' end 

对于rails 4.2正确的是:

 class Foo < ActiveRecord::Base self.table_name = 'myschema.foo' end 

更多信息 – http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name-3D

由于set_table_name已被删除,并被self.table_namereplace。

我认为你应该遵循如下的代码:

 class Foo < ActiveRecord::Base self.table_name 'myschema.foo' end 

在迁移中:

 class CreateUsers < ActiveRecord::Migration def up execute 'CREATE SCHEMA settings' create_table 'settings.users' do |t| t.string :username t.string :email t.string :password t.timestamps null: false end end def down drop_table 'settings.users' execute 'DROP SCHEMA settings' end end 

在模型中可选

 class User < ActiveRecord::Base self.table_name 'settings.users' end 

方法set_table_name已被删除。 self.table_name工作正常。