ruby-on-rails 将多个PostgreSQL模式与Rails模型配合使用

np8igboo  于 2022-11-26  发布在  Ruby
关注(0)|答案(7)|浏览(156)

我有一个PostgreSQL数据库用于我的Rails应用程序。在名为“public”的模式中,存储了主要的Rails模型表等。我创建了一个“discogs”模式,其中的表名有时与“public”模式中的表名相同-这也是我使用模式来组织这些表的原因之一。
我将如何在我的应用程序中设置来自“discogs”模式的模型?我将使用Sunspot让Solr索引这些模型。我不确定你将如何做这件事。

cs7cruho

cs7cruho1#

导轨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

6vl6ewon

6vl6ewon2#

在迁移中:

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
6qftjkof

6qftjkof3#

因为set_table_name已被删除,并由self.table_name替换。
我认为您应该编写如下代码:

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

mrwjdhj34#

只管做

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

ddrv8njm5#

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

92vpleto

92vpleto6#

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
fdbelqdn

fdbelqdn7#

数据库.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

希望能帮上忙。

相关问题