2010-07-15 9 views
0

C'est une question assez simple, mais disons que je crée un modèle pour Person. La personne a évidemment le prénom, le nom, l'âge, etc. Mais la personne a aussi des informations de contact comprenant des choses comme la ligne d'adresse 1, la ligne d'adresse 2, la ville, l'état, le pays, le téléphone 1, etc. Cela a-t-il plus de sens de créer un modèle pour Person puis de lister ces informations en tant que tables dans le modèle ou de créer, par exemple, un modèle ContactInfo (ou Address, etc.), puis d'associer la personne à ContactInfo via une association (Person has_one ContactInfo/Personne has_one Adresse/Adresse belongs_to Person, etc)?Ruby on Rails/Activerecord modélisation mySQL

Laquelle de ces méthodes est la meilleure et quels sont les avantages/inconvénients de chaque méthode?

modifier: à j re en ..

Donc, avec cette approche, devrais-je créer alors un modèle adressable?

script/generate model Addressable 

class Addressable < ActiveRecord::Base 
    #stuff here? 
end 

ou est-ce inutile?

Aussi, aurais-je besoin d'ajouter cette ligne à la create_users.rb:

t.references :addressable, :polymorphic => true 

Je me sens comme si je manque quelque chose, mais je ne suis pas sûr de ce que. J'apprécie l'aide d'une tonne, btw! Merci!

+0

Je viens de mettre à jour ma réponse:] –

Répondre

2

Je créerais des tables séparées/modèles pour l'adresse, le téléphone et les choses comme ceci et les feraient polymorphic. Comme ceci:

class Address < ActiveRecord::Base 
    belongs_to :addressable, :polymorphic => true 
end 

class Person < ActiveRecord::Base 
    has_one :address, :as => :addressable 
end 

Je crois que c'est la meilleure façon parce que vous pouvez avoir besoin d'ajouter plus tard, par exemple, un modèle de l'entreprise et il sera facile de le faire addressable.

Modifier

Utilisation du address comme exemple, vous auriez besoin d'un modèle Address, non Addressable.

Et vous devrez ajouter

t.references :addressable, :polymorphic => true 

ou

t.belongs_to :addressable, :polymorphic => true 

à votre migration create_addresses, de sorte que vous aurez la addressable_id et addressable_type dans le tableau addresses.

Faites-moi savoir si vous avez d'autres doutes:]

+0

Merci pour l'aide! J'ai mis à jour ma question pour refléter l'information que vous m'avez donnée. –

1

la réponse ci-dessus fait sens, mais pensez à combien de champs dont vous avez besoin et combien de documents que vous devez gérer. créer une table pour chaque champ supplémentaire peut être trop d'effort.

une autre approche pourrait être quelque chose de plus souple: créer une table (par exemple, person_details) avec 3 champs: person_id: entier, field_name: string, field_data: string, le modèle:

class PersonDetail < ActiveRecord::Base 
    belongs_to :person 
end 

cette façon, vous peut ajouter n'importe quel champ supplémentaire dont vous avez besoin: phone1 ..téléphoneN, adresse1..adresseN, et ainsi de suite.

une autre approche similaire est d'effectuer une pré-déterminer les noms des champs, afin d'éviter étiquettes différentes lors des insertions:

class PersonDetail < ActiveRecord::Base 
    belongs_to :person 

    FIELD_NAMES => { 'Address' => 1, 'Phone' => 2) 
end 

dans ce cas, vous déclarez le field_name comme entier (car il ne stocke que la valeur de le hachage, pas une chaîne).