2010-01-22 6 views
3

J'ai deux modèles:rails appartient à has_one. besoin d'une explication

Customer et Contact

tableau Customers a colonnes :id, :firstName, :lastName

Table Contacts a colonnes :id, :cid, :hphone, :cphone

Donc, si la table des clients a données

1 Josh McDonnel 

Ensuite table Contacts a correspondant

5 1 947-245-2342 342-543-8585 

Quelles sont les associations puis-je utiliser ici?

Will Contactez ont

belongs_to :customer, :foreign_key => "id", :class_name => "Customer" 

Qu'est-ce que la classe client doit avoir?

En outre, comment un look simple find_byXXX comme si je veux tous les clients (firstName, lastName et correspondant hphone et cphone)

Répondre

4

Vous êtes proche, mais votre belongs_to devrait être cela.:foreign_key doit être le nom du champ stockant une référence à l'identifiant principal:

belongs_to :customer, :foreign_key => "cid" 

Et dans votre classe Customer.rb:

has_one :contact, :foreign_key => "cid" 

Enfin, votre recherche pourrait ressembler à ceci:

@customers = Customer.all(:include => :contact) 

Ensuite, vous pouvez l'utiliser dans une boucle à votre vue:

<% @customers.each do |customer| %> 
    <p>Name: <%= customer.firstName %> <%= customer.lastName %></p> 
    <p>Home: <%= customer.contact.hphone %></p> 
    <p>Work: <%= customer.contact.cphone %></p> 
<% end %> 

Soit dit en passant, si vous aviez utilisé customer_id au lieu de cid votre association pourrait juste être:

#Contact.rb 
belongs_to :customer 

#Customer.rb 
has_one :contact 
+0

merci pour une excellente explication. J'essaie de faire la recherche que vous avez suggérée mais dans mon cas 'cid' est varchar mais' id' est un entier. de sorte que la recherche ne fonctionne pas et génère des erreurs. Je peux revenir en arrière et changer cid en entier mais dire, par exemple je ne voulais pas changer cela. Quel serait le travail? – Omnipresent

+0

Bien sûr, il suffit de lancer une migration. (SAUVEGARDEZ VOS DONNÉES D'ABORD!) Exécutez ceci: 'script/générer la migration ChangeContactsForeignKey' et utilisez ce code: http://pastie.org/790513 –

+0

Bien sûr, utilisez' rake db: migrate' quand vous avez terminé ces étapes –

7

rappeler une règle: La table avec la clé étrangère dans ce belongs_to la table que cette clé étrangère références.

1

L'objet dont la table contient la clé étrangère "appartient à" l'objet qui ne l'est pas.

Si le client a un contact et un contact appartenant au client, la clé étrangère ("customer_id" par défaut) existera dans la table des contacts.

Vous ne voulez probablement pas utiliser "id" comme clé étrangère car "id" est réservé à la colonne contenant l'ID du contact. La spécification d'un nom de classe n'est pas non plus nécessaire, car le nom de la classe est le même que le nom de la relation (dans ce cas, "client").

Client aurait:

has_one :contact 

Contactez aurait:

belongs_to :customer 

Alors si vous voulez trouver un certain de contact client vous pouvez simplement appeler:

@customer.contact 

ou vice versa.

Votre autre question concernant find_by_XXX est un peu vague. Si vous voulez trouver tous les clients avec le premier nom « John » vous pouvez utiliser:

@customers_named_john = Customer.find_by_firstName("John") 

Mais je ne suis pas sûr que ce soit ce que vous demandez au sujet.

+0

Dans son schéma de base de données, il semble qu'il veut stocker le 'id' du' 'Customer' dans cid'. –

Questions connexes