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

时间:2012-01-10 15:59:57

标签: ruby-on-rails postgresql models database-schema schema-design

我的Rails应用程序有一个PostgreSQL数据库。在名为'public'的模式中,存储了主Rails模型表等。我创建了一个'discogs'模式,其中的表名称有时与'public'模式中的名称相同 - 这是其中一个原因。我正在使用模式来组织这个。

如何在我的应用中使用'discogs'架构设置模型?我将使用太阳黑子让Solr为这些模型编制索引。我不确定你会怎么做。

6 个答案:

答案 0 :(得分:98)

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"

定义每个连接后,创建两个模型:

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

并且,所有模型都继承自相应的模式:

class MyModelFromPublic < PublicSchema
  set_table_name :my_table_name
end

class MyOtherModelFromDiscoGs < DiscoGsSchema
  set_table_name :disco
end

我希望它有所帮助。

答案 1 :(得分:11)

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

答案 2 :(得分:9)

只做

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

答案 3 :(得分:9)

在迁移中:

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

答案 4 :(得分:7)

由于set_table_name已被删除,因此被self.table_name取代。

我认为你应该按照以下代码进行编码:

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

答案 5 :(得分:1)

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