RNR: normalizzazione del database, modelli e associazioni dei binari
-
12-12-2019 - |
Domanda
OK, quindi ho tre oggetti diversi: una persona, un posto e un'attrezzatura.Ogni può avere un indirizzo, nella maggior parte dei casi di indirizzo multiplo e più numeri di telefono.Quindi il mio pensiero è creare tabelle specifiche dell'oggetto, l'indirizzo ha un indirizzo e una tabella del telefono.Qui la mia domanda:
In questo modo, in genere, nel mio mondo SQL, avrei solo una colonna Object_ID nell'indirizzo e nella tabella del telefono e inserire un ID dell'oggetto nella colonna ID oggetto, quindi seleziona tutti gli indirizzi o i record del telefono che corrispondono.
Potrei farlo, find_by_sql e ottenere i record ma preferirei rimanere all'interno del paradigma di Activecord.Quindi significa che dovrei avere una colonna ID nella tabella per ogni oggetto, quindi una persona_id, place_id, ecc.
Qual è il modo "giusto" per modellarlo?
Soluzione
È possibile creare associazioni polimorfiche con ActiveCord, in modo da poter aggiungere object_id
e object_type
agli indirizzi e alle tabelle telefoniche e per specificare le associazioni come questa:
class Address
belongs_to :object, :polymorphic => true
end
class PhoneNumber
belongs_to :object, :polymorphic => true
end
class Person
has_many :addresses, :as => :object
has_many :phone_numbers, :as => :object
end
class Place
has_many :addresses, :as => :object
has_many :phone_numbers, :as => :object
end
class Equipment
has_many :addresses, :as => :object
has_many :phone_numbers, :as => :object
end
.
In questo modo, Person.first.addresses
dovrebbe eseguire una query come Addresses.where(:object_type => "Person", :object_id => Person.first.id)
e viceversa per il resto dei modelli e delle associazioni.