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