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

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

如何从应用程序中的“ discogs”模式设置模型?我将使用 Sunspot 来让 Solr 索引这些模型。我不知道你会怎么做。

29132 次浏览

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

希望能有所帮助。

照做就是了

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

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

因为 set_table_name被移除了,取而代之的是 self.table_name

我认为您应该遵循以下代码:

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

Rails4.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

在移民方面:

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
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class


# Set schema
def self.schema(schema)
self.table_name = "#{schema}.#{self.name.tableize}"
end
end


class Foo < ApplicationRecord
schema :myschema
end