Associazioni su sottoclassi

Salve a tutti,

scrivo qui per un problema che ho attualmente.

In pratica mi trovo a dover realizzare una tabella relativa alle analisi
dei pazienti, che prende come chiavi esterne quella del tipo di analisi,
del paziente, del dottore che prescrive e dell’infermiere che esegue.

Per le prime due chiavi non c’e’ problema, le riesco a far prendere
perfettamente, il dubbio e’ sulla chiave del medico e dell’infermiere,
perche’ la situazione in cui mi trovo e’ che medico e infermiere sono
due sottoclassi che ereditano dalla tabella “Person”.

Chiedevo se voi conoscete qualche modo per far capire alla tabella
analisi_paziente che il campo che io chiamo doctor_id deve fare
riferimento al person_id della tabella Person (stessa cosa per nurse_id)
di cui doctor e’ una sottoclasse.

Se non mi sono spiegato abbastanza bene chiedete pure, intanto grazie
mille per le risposte!

On Apr 24, 2008, at 2:14 PM, Samuele Crescenti wrote:

Chiedevo se voi conoscete qualche modo per far capire alla tabella
analisi_paziente che il campo che io chiamo doctor_id deve fare
riferimento al person_id della tabella Person (stessa cosa per
nurse_id)
di cui doctor e’ una sottoclasse.

In teoria dovresti avere una situazione cosi’:

class Person < ActiveRecord::Base; end
class Doctor < Person; end
class Nurse < Person; end

class AnalisiPaziente < ActiveRecord::Base
belongs_to :doctor
belongs_to :nurse
end

Quel che non capisco e’ da dove salti fuori il campo “person_id”…

S.

Ciao, innanzitutto grazie per la risposta.

Il campo person_id salta fuori dalla migrate della tabella
AnalisiPaziente, in cui per far capire le associazioni con doctor e
nurse ho creato i campi doctor_id e nurse_id, che pero’ non riesco ad
usare, a differenza per esempio del patient_id che ruby in automatico
mi collega alla tabella paziente una volta dichiarati nei model i
belongs_to o has_many.

Come faccio a dichiarare che con “doctor_id” e “nurse_id” io intendo di
andarsi a prendere l’id del dottore o dell’infermiere della tabella
person? perche’ in person esiste solo il campo “id” globale, che e’ lo
stesso per infermieri e medici, non esistono i campi “doctor_id” e
“nurse_id”.

E nei model di person e Analisi paziente cosa dichiaro?

grazie mille

Stefano C. wrote:

In teoria dovresti avere una situazione cosi’:

class Person < ActiveRecord::Base; end
class Doctor < Person; end
class Nurse < Person; end

class AnalisiPaziente < ActiveRecord::Base
belongs_to :doctor
belongs_to :nurse
end

Quel che non capisco e’ da dove salti fuori il campo “person_id”…

S.

On Apr 24, 2008, at 4:09 PM, Samuele Crescenti wrote:

di
andarsi a prendere l’id del dottore o dell’infermiere della tabella
person? perche’ in person esiste solo il campo “id” globale, che e’ lo
stesso per infermieri e medici, non esistono i campi “doctor_id” e
“nurse_id”.

Che versione di Rails stai usando?

S.

Che versione di Rails stai usando?

uso ruby 1.8.6 con rails 2.0.2

On Apr 24, 2008, at 6:55 PM, Samuele Crescenti wrote:

Che versione di Rails stai usando?

uso ruby 1.8.6 con rails 2.0.2

Allora non so quale sia il problema, l’esempio che ho riportato io
funziona perfettamente…

S.

ti incollo proprio il codice così magari si capisce meglio:

model/person.rb
class Person < ActiveRecord::Base
has_one :user
end

class Doctor < Person
end

class Nurse < Person
end

model/patients_analysis.rb
class PatientsAnalysis < ActiveRecord::Base
belongs_to :analysis
belongs_to :patient
belongs_to :doctor
belongs_to :nurse
end

db/migrate/019_create_patients_analyses.rb
class CreatePatientsAnalyses < ActiveRecord::Migration
def self.up
create_table :patients_analyses do |t|
t.integer :analysis_id
t.string :patient_id
t.integer :doctor_id
t.integer :nurse_id
t.boolean :performed
t.text :results
t.date :prescription_date
t.date :execution_date

  t.timestamps
end

end

def self.down
drop_table :patients_analyses
end
end

On Apr 24, 2008, at 7:10 PM, Samuele Crescenti wrote:

ti incollo proprio il codice così magari si capisce meglio:

E fin qui ci siamo… posta anche la migrazione di Person

S.

class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.string :type

  # common attributes
  t.string  :first_name
  t.string  :last_name

  # attributes for type=Infermiere
  #

  # attributes for type=medico
  #

  t.timestamps

end

end

def self.down
drop_table :people
end
end

On Apr 24, 2008, at 7:29 PM, Samuele Crescenti wrote:

 #

 # attributes for type=medico
 #

 t.timestamps

end

Boh… posso solo dare la risposta classica dei programmatori: “da me
funziona” :slight_smile:

S.

Grazie mille lo stesso per il tempo e l’aiuto!

proverò ancora a vedere se riesco a risolvere in qualche modo e in caso
positivo lascio traccia che magari in futuro può far comodo a qualcuno
:slight_smile:

grazie ancora!

ciao

Stefano C. wrote:

Boh… posso solo dare la risposta classica dei programmatori: “da me
funziona” :slight_smile:

S.