Rails Postgresql несколько схем и одно и то же имя таблицы - PullRequest
6 голосов
/ 08 декабря 2011

У меня есть две таблицы в двух разных схемах, например cases и events.

В каждой схеме у меня есть базовая таблица

  • events.basic
  • cases.basic

Эти таблицы имеют отношения:

  • events.basic имеет один cases.basic (cases.basic имеет много events.basic)

Мои попытки не увенчались успехом:

файл cases_basic.rb

class CasesBasic < ActiveRecord::Base
  set_table_name 'cases.basic'
  set_primary_key 'case_id'
  has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id'
end

файл events_basic.rb

class EventsBasic < ActiveRecord::Base
  set_table_name 'events.basic'
  set_primary_key 'event_id'
  belongs_to :Case, :class_name => 'CasesBasic', :foreign_key => 'case_id'
end

Enviroment: Рубин 1.9.3, Рельсы 3.1.3, gem 'pg'

Мне нужен ответ на этот вопрос:

  1. как справиться с этой ситуацией в Rails Active Record?
  2. как запросить эти таблицы?
  3. как справиться с этой ситуацией в rake db:schema:dump

РЕДАКТИРОВАТЬ:

После изменения belongs_to и has_many (как рекомендует Catcall) у меня та же ошибка

PGError: ERROR:  column basic.case_id does not exist
LINE 1: ...IN "cases"."basic" ON "cases"."basic"."case_id" = "events"."...
                                                             ^
: SELECT  "events"."basic".* FROM "events"."basic" INNER JOIN "cases"."basic" ON "cases"."basic"."case_id" = "events"."basic"."case_id" LIMIT 3

Rails генерирует плохой SQL. Я должен был сделать, используя некоторые псевдонимы:

ВЫБРАТЬ t1. * ИЗ "событий". "Базовое" t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ "case". "Базовое" t2 ON t1. "Case_id" = t2. "Case_id" LIMIT 3


РЕДАКТИРОВАТЬ 2: Хорошо, это была моя ошибка ***, я не добавил столбец events.basic.case_id и внешний ключ в моей базе данных примера. Работает!


Вопросы 1 и 2 работают, но у нас есть вопрос о rake db:schema:dump, что на счет Rails генерирует модели только для публичной схемы.

У меня так много таблиц и отношений, что я хочу их сгенерировать.

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

[Edit: после дальнейшего чтения, я не думаю, что ActiveRecord вообще поддерживает несколько схем.Но я могу ошибаться.Я пока оставлю этот ответ здесь, хотя это почти наверняка неправильно.( Концептуально это правильно. Но люди, которые создавали ActiveRecord, вероятно, не общались ни с кем из людей, занимающихся базой данных, потому что то, что могли знать люди из баз данных?) Похоже, что IBM работала над этой проблемой в 2008 году, но яне вижу, как эта работа закончилась.]

У PostgreSQL нет проблем с установкой ссылок на внешние ключи для таблиц с одинаковыми именами в разных схемах.Подобный код

class CasesBasic < ActiveRecord::Base
  set_table_name 'cases.basic'
  set_primary_key 'case_id'
  has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id'
end

, вероятно, должен соответствовать схеме.

Не правда ли, что таблица case.basic "имеет много" событий, не так ли?Нет, у него "много" событий.Перенесите такие изменения во все два класса и дайте нам знать, как это работает.(Здесь нет Rails, или я бы проверил это для вас.)

1 голос
/ 14 августа 2013

Я бы порекомендовал использовать pg_power gem . Он предоставляет синтаксис для создания схем PostgreSQL в таких миграциях:

def change
  drop_schema 'demography'
  create_schema 'politics'
end

А также позаботится о правильном сбросе схем в файл schema.rb.

1 голос
/ 08 декабря 2011

Выезд http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/

Здесь описывается, как настроить приложение Rails для использования базы данных Postgres с несколькими схемами. Он сравнивает поиск в таблице с функциональностью пути Unix, начиная с определенных мест и заканчивая общими местами.

После интеграции путей к схемам вы можете успешно запрашивать эти таблицы. db: schema: dump будет читать таблицы, используя тот же приоритет схемы, который предпочитает ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...