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 }
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
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.) –
Merci. Cela fonctionne avec: user_id. Vraiment merci pour votre aide. – Niao