2011-12-08 14 views
6

Ho due tabelle in due schemi diversi ad es. cases e events.Rails Postgresql schemi multipli e lo stesso nome tabella

In ogni schema devo tabella di base

  • events.basic
  • cases.basic

Questi tavoli hanno rapporti:

  • events.basic ha una cases.basic (cases.basic ha molti events.basic)

I miei tentativi sono falliti:

file di 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 

file di 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 

Ambiente: Rubino 1.9.3, Rails 3.1.3, gem 'pg'

ho bisogno di risposta per questo le domande:

  1. come gestire questa situazione in Rails attivo Record?
  2. come interrogare queste tabelle?
  3. come gestire questa situazione in rake db:schema:dump

EDIT:

Dopo aver cambiato belongs_to e has_many (come catcall suggeriscono) ho lo stesso errore

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 generano cattivo SQL. Dovrei essere fatto utilizzando alcuni alias:.

selezionare T1 * FROM "eventi" T1 "di base" INNER JOIN "casi" T2 "di base" a t1 "case_id" = t2 "case_id" LIMITE 3

....

EDIT 2: Ok 'stato il mio f *** bug, non ho aggiunto colonna events.basic.case_id e chiave esterna nel mio database esempio. Funziona!


domande 1 e 2 stanno lavorando, ma ci sono domande su rake db:schema:dump che ne dici? Rails genera modelli solo per lo schema pubblico.

Ho così tante tabelle e relazioni che voglio generarle.

+0

Il tuo ': Events' e': Case' dovrebbe probabilmente essere ': events' e': case' ma che probabilmente non risolvere il problema. –

+0

@muistooshort ': Events' e': Case' sembrano alias e non sono portati a SQL in questo caso –

+0

Sono un po 'confuso riguardo a come appaiono i tavoli, come dovrebbero essere i casi "ON". "Basic" . "case_id" = "events". "basic". "case_id" 'condizioni di join come? Una delle tabelle non ha un 'case_id' e questo è un problema, come scriveresti quella condizione di join se lo facessi a mano? –

risposta

1

Partenza http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/

Questo viene descritto come configurare un'applicazione Rails utilizzare un database Postgres con più schemi. Paragona la tabella alla funzionalità del percorso Unix, iniziando da posizioni specifiche e tornando alle posizioni generali.

Una volta integrati i percorsi dello schema, è possibile eseguire query su queste tabelle correttamente. db: schema: dump leggerà le tabelle usando la stessa precedenza dello schema che l'applicazione preferisce.

+1

Grazie per la risposta, ma sfortunatamente non risolve il problema, autore che usa qui l'approccio SET SEARCH_PATH TO schema1, schema2' che è ottimo per un semplice database quando non si ha bisogno di relazioni tra tabelle in schemi diversi e non si risolve più problemi di schema , non puoi unire tabelle con lo stesso nome. E ho 300 tavoli nel mio sistema, dove molti di loro hanno lo stesso nome. –

1

[Modifica: dopo ulteriori letture, non credo che ActiveRecord supporti affatto più schemi. Ma potrei sbagliarmi. Lascerò qui questa risposta per il momento, anche se è quasi certamente sbagliato. (Concettualmente è ma le persone che hanno creato ActiveRecord probabilmente non hanno parlato con nessun database, perché cosa potrebbero sapere le persone del database?) Sembra che IBM stia lavorando a questo problema nel 2008, ma non vedo come terminato questo lavoro.]

PostgreSQL non ha problemi nell'impostare riferimenti a chiavi esterne a tabelle che hanno lo stesso nome in schemi diversi. Codice come questo

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 

probabilmente deve essere qualificato per schema.

Ora, non è vero che la tabella cases.basic "ha molti" eventi, vero? No, "ha molti" eventi.basici. Porta quel tipo di cambiamento durante le tue due classi e facci sapere come funziona. (No Rails qui, o lo testerei per te.)

+0

"Ma le persone che hanno creato ActiveRecord probabilmente non hanno parlato con nessun utente di database, perché cosa potrebbero sapere le persone del database?" Le persone con DB conoscono cose sciocche come l'integrità referenziale (che Rails pensa sia un problema di applicazione). Rails ha molte buone idee, ActiveRecord non è uno di questi. –

+0

@muistooshort: E schemi. –

+0

E i vincoli CHECK, gli indici di funzione, i trigger e qualsiasi altra cosa che, ad esempio, MySQL3 non ha compreso. –

1

Mi consiglia di utilizzare pg_power gem. Esso fornisce sintassi per la creazione di schemi di PostgreSQL in migrazioni come questo:

def change 
    drop_schema 'demography' 
    create_schema 'politics' 
end 

E si occupa anche sugli schemi di dumping correttamente nel file di schema.rb.

Problemi correlati