2010-11-27 4 views
1

J'ai deux tables: intérêts et Link_ui (ceci est pour l'enregistrement de l'utilisateur et de l'intérêt)
Je veux saisir l'identifiant de l'utilisateur et montrer tous les intérêts nom que l'utilisateur a.
ROR: Sélection à partir de plusieurs tables

Dans contrôleur Link_ui:

def output 
    @interests = LinkUi.find_by_sql [ 'SELECT interests.name FROM link_uis, interests 
    WHERE link_uis.interest_id = interests.id AND link_uis.user_id=? ', params['user_id'] ] 

Et la page d'entrée:

<%= form_tag :action => 'output', :method => 'post' %> 
    enter id. 
    <%= text_field_tag ':user_id', '', 'size' => 30 %> 

Il sort rien, mais je suis sûr qu'il ya des données dans la base de données appareillés. Et si je ne paramètre pas entrée vient de mettre link_uis.user_id = 1, il sort:

Quel est le problème avec ce ..

Répondre

4

Eh bien, find_by_sql sur un modèle LinkUi vous attend à revenir colonnes du tableau link_uis, alors que vous sélectionnez simplement interests.name. Cependant, vous êtes en train de vous battre avec ActiveRecord, là. :)

Vous voulez généralement éviter find_by_sql, et laisser ActiveRecord générer votre SQL pour vous. Probablement le plus important pour votre exemple sont les associations.

La façon dont je le vois, vous avez un tas de utilisateurs, et un tas de Loisirs. Votre LinkUis lient ces deux ensemble (un LinkUi appartient à un utilisateur et un intérêt). N'hésitez pas à me corriger à ce sujet; C'est la logique de votre entreprise, comme je le comprends de votre exemple.

Ces classes (dont j'ai souligné les noms) sont vos modèles, définis dans le répertoire app/models. Les assocations (relations) entre eux devraient être définies sur ces classes.


commencer avec une simple association dans votre utilisateur modèle:

class User < ActiveRecord::Base 
    has_many :link_uis 
end 

Et dans votre intérêt modèle:

class Interest < ActiveRecord::Base 
    has_many :link_uis 
end 

Ensuite, le modèle LinkUi que les liens ensemble:

class LinkUi < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :interest 
end 

Maintenant, compte tenu de tout utilisateur, vous pouvez obtenir son/ses LinkUis en disant simplement user.link_uis.all, et pour chaque LinkUi, vous pouvez obtenir l'intérêt comme link_ui.interest.Vous pouvez dire à ActiveRecord d'essayer d'aller chercher ces deux images en une fois aussi efficacement que possible en utilisant :include, et d'obtenir une liste des noms d'intérêt en utilisant la méthode standard Ruby collect. Il devient alors:

user = User.find params['user_id'] 
link_uis = user.link_uis.all(:include => :interest) 
interest_names = link_uis.collect { |link_ui| link_ui.interest.name } 

Vous pouvez prendre un peu plus loin; Pour les Utilisateur, vous pouvez directement obtenir ses Intérêts. Une fois que vous avez mis en place les associations ci-dessus, vous pouvez plier deux « étapes » en un seul, comme celui-ci:

class User < ActiveRecord::Base 
    has_many :link_uis 
    has_many :interests, :through => :link_uis 
end 

Ce qui pourrait transformer l'exemple dans ce one-liner:

interest_names = User.find(params[:user_id]).interests.collect { |i| i.name } 
+0

Salut, il sort "ActiveRecord :: RecordNotFound dans le lien uisController # sortie Impossible de trouver l'utilisateur sans ID". Mais si j'utilise "interest_names = User.find (1) .interests.collect {| i | i.name}", cela fonctionne. Alors, ai-je fait quelque chose de mal en entrée? et je suis sûr que le paramètre est envoyé. Je vous remercie. – Niao

+0

Le fichier journal Rails devrait vous montrer les paramètres de formulaire que le serveur voit. Je viens de remarquer que vous appelez 'text_field_tag' avec' ': user_id'', mais ce devrait être simplement' 'user_id' 'ou ': user_id'. (Le premier est du type chaîne Ruby, le dernier du type symbole Ruby.) –

+0

Merci. Cela fonctionne avec: user_id. Vraiment merci pour votre aide. – Niao

Questions connexes