2009-06-25 6 views
2

Ruby on Rails est une nouveauté pour moi. J'essaye de récupérer l'ensemble des colonnes de 3 tables différentes. Je pensais pouvoir utiliser la vue SQL pour récupérer mes résultats mais je n'arrivais pas à trouver un moyen d'utiliser les vues dans Rails. Voici mes tables. 1) User table -> nom d'utilisateur, mot de passe et email 2) UserDetails table -> clé étrangère: user_id, nom, adresse1, ville etc. 3) UserWorkDetails -> clé étrangère: user_id, travail adresse1, travail type, etcComment joindre plusieurs tables avec des relations un à un dans les rails

Ces 3 tables ont des relations un à un. Ainsi, la table 2 appartient à la table 1 et la table 3 appartient également à la table 1. Le tableau 1 contient un détail d'utilisateur et un détail d'utilisateur. Je souhaite obtenir l'adresse e-mail de l'utilisateur, son nom, son adresse1, sa ville, son adresse de travail1 et son type de travail à l'aide de jointures.

Quelle est la meilleure façon de gérer cela?

Répondre

2

Pour obtenir ce que vous voulez faire utiliser rapidement l': inclure l'option d'inclure les deux autres tables lorsque vous interrogez la table primaire, donc:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details]) 

Cela suffit de charger tous les champs des tables Une fois qu'une seule requête est exécutée, vous pouvez faire ce dont vous avez besoin avec les objets car ils contiennent toutes les données utilisateur. Je trouve que c'est assez simple et suffisant, et avec cela vous n'optimisez pas trop tôt avant de savoir où sont les goulots d'étranglement.

Toutefois, si vous voulez vraiment charger simplement les champs obligatoires utilisent: sélectionnez l'option et la méthode ActiveRecord::Base find:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details], :select => "id, email, name, address1, city, work_address1") 

Bien que mon SQL est un peu rouillé au moment.

-3

User.find(:first, :joins => [:user_work_details, :user_details], :conditions => {:id => id})

Je dirais que d'essayer de sélectionner les champs que vous voulez est une optimisation prématurée à ce stade, mais vous pouvez le faire dans un complexe: hachage select.

:include fera 3 sélections, 1 sur l'utilisateur, un sur les détails de l'utilisateur, et un sur les détails de l'utilisateur. C'est génial pour sélectionner une collection d'objets de plusieurs tables dans des requêtes minimales.

http://apidock.com/rails/ActiveRecord/Base/find/class

4

Les données sont (sont) dans les modèles. Tout le reste n'est qu'une optimisation. Ainsi, address1 est à user.user_detail.address1, par exemple.

si vous avez

class User 
    has_one :user_detail 
    has_one :user_work_detail 
end 
class UserDetail 
    belongs_to :user 
end 
class UserWorkDetail 
    belongs_to :user 
end 

Avec user_id colonnes dans les tables nommées user_details et user_work_details puis tout le reste est fait pour vous. Si vous avez besoin d'optimiser plus tard, vous pouvez: inclure les modèles possédés, mais ce n'est pas nécessaire pour que tout fonctionne.

Questions connexes