Использование нескольких схем PostgreSQL с моделями Rails - PullRequest
64 голосов
/ 10 января 2012

У меня есть база данных PostgreSQL для моего приложения на Rails.В схеме «public» хранятся основные таблицы моделей Rails и т. Д. Я создал схему «discogs», в которой будут таблицы с именами, которые иногда совпадают с «public», что является одной из причинЯ использую схемы для организации этого.

Как мне настроить модели из схемы 'Discogs' в моем приложении?Я буду использовать Sunspot, чтобы позволить Solr индексировать и эти модели.Я не уверен, как ты это сделаешь.

Ответы [ 6 ]

101 голосов
/ 12 января 2012

Адаптер PostgreSQL schema_search_path в database.yml решает вашу проблему?

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

Надеюсь, это поможет.

12 голосов
/ 11 марта 2016

Правильный вариант для рельсов 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

10 голосов
/ 15 января 2012

Просто сделай

class Foo < ActiveRecord::Base
  set_table_name 'myschema.foo'
end
9 голосов
/ 06 мая 2016

В миграциях:

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
8 голосов
/ 20 января 2016

Поскольку set_table_name было удалено и заменено на self.table_name.

Я думаю, вы должны кодировать как:

class Foo < ActiveRecord::Base
  self.table_name =  'myschema.foo'
end
1 голос
/ 05 августа 2015

метод set_table_name был удален. self.table_name отлично работает.

...