Using multiple PostgreSQL schemas with Rails models

后端 未结 6 1893
挽巷
挽巷 2020-12-07 12:01

I have a PostgreSQL database for my Rails application. In the schema named \'public\' the main Rails models tables are stored etc. I have created a \'discogs\' schema which

相关标签:
6条回答
  • 2020-12-07 12:40

    The correct one for rails 4.2 is as:

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

    More info -http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name-3D

    0 讨论(0)
  • 2020-12-07 12:40

    In migrations:

    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
    

    Optional in model

    class User < ActiveRecord::Base
      self.table_name 'settings.users'
    end
    
    0 讨论(0)
  • 2020-12-07 12:44

    Because set_table_name was removed, and it was replaced by self.table_name.

    I think you should code follow as:

    class Foo < ActiveRecord::Base
      self.table_name =  'myschema.foo'
    end
    
    0 讨论(0)
  • 2020-12-07 12:45

    PostgreSQL adapter schema_search_path in database.yml does solve your problem?

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

    Or, you can to specify different connections for each schema:

    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"
    

    After each connection defined, create two models:

    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
    

    And, all your models inherit from the respective schema:

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

    I hope it helps.

    0 讨论(0)
  • 2020-12-07 12:46

    method set_table_name has been remove. self.table_name works fine.

    0 讨论(0)
  • 2020-12-07 12:47

    Just do

    class Foo < ActiveRecord::Base
      self.table_name = 'myschema.foo'
    end
    
    0 讨论(0)
提交回复
热议问题