Ruby Forum Italian Ruby user group > Associazioni su sottoclassi

Posted by Samuele Crescenti (sem41)
on 24.04.2008 14:14
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!
Posted by Stefano Cobianchi (Guest)
on 24.04.2008 14:23
(Received via mailing list)
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.
Posted by Samuele Crescenti (sem41)
on 24.04.2008 16:09
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 Cobianchi 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.
Posted by Stefano Cobianchi (Guest)
on 24.04.2008 16:24
(Received via mailing list)
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.
Posted by Samuele Crescenti (sem41)
on 24.04.2008 18:55
> Che versione di Rails stai usando?

uso ruby 1.8.6 con rails 2.0.2
Posted by Stefano Cobianchi (Guest)
on 24.04.2008 19:02
(Received via mailing list)
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.
Posted by Samuele Crescenti (sem41)
on 24.04.2008 19:10
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
Posted by Stefano Cobianchi (Guest)
on 24.04.2008 19:20
(Received via mailing list)
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.
Posted by Samuele Crescenti (sem41)
on 24.04.2008 19:29
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
Posted by Stefano Cobianchi (Guest)
on 24.04.2008 21:44
(Received via mailing list)
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" :-)

S.
Posted by Samuele Crescenti (sem41)
on 25.04.2008 01:48
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 
:)

grazie ancora!

ciao


Stefano Cobianchi wrote:
> 
> Boh... posso solo dare la risposta classica dei programmatori: "da me
> funziona" :-)
> 
> S.