Использование нескольких схем PostgreSQL с Rails-моделями
У меня есть база данных PostgreSQL для моего приложения Rails. В схеме с именем "public" хранятся основные таблицы моделей Rails и т.д. Я создал схему "discogs", которая будет иметь таблицы с именами, которые иногда такие же, как в "общедоступной" схеме, что является одной из причин, по которым Я использую схемы, чтобы организовать это.
Как мне настроить модели из схемы "discogs" в моем приложении? Я буду использовать Sunspot, чтобы позволить Solr индексировать эти модели. Я не уверен, как вы это сделаете.
Ответы
Ответ 1
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
Надеюсь, это поможет.
Ответ 2
Правильный для рельсов 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
Ответ 3
Просто сделай
class Foo < ActiveRecord::Base
self.table_name = 'myschema.foo'
end
Ответ 4
Потому что set_table_name
было удалено и заменено на self.table_name
.
Я думаю, вы должны написать следующее:
class Foo < ActiveRecord::Base
self.table_name = 'myschema.foo'
end
Ответ 5
В переходах:
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
Ответ 6
Метод set_table_name
был удален. self.table_name
работает отлично.