De retour d'un Champ Unique avec des Rails de Requête
J'ai de la difficulté avec quelque chose qui devrait être si facile, mais je ne sais pas ce que je fais mal. Je suis tout simplement essayer de faire une requête qui ne retourne qu'un seul champ à la place du dossier complet dans Rails 3.
la méthode de modèle de
def self.find_user_username(user_id)
user_name = User.select("user_name").where(user_id)
return user_name
end
Je regarde le Guide Rails ( http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields)
et il dit simplement (où viewable_by, locked = champs):
Client.select("viewable_by, locked")
J'ai essayé flip flop la sélectionner, comme suit:
User.select("user_name").where(user_id) - AND -
User.where(user_id).select("user_name")
mais ni travail. En fait, j'ai même essayé:
user_name = User.select("yoda").where(user_id)
et je n'ai pas eu une erreur. Quand je me regarde dans la vue, où j'ai:
Friend.find_user_username(friend.user_id)
Je viens d'obtenir le hash: ActiveRecord::Relation:0x2f4942f0
Ce qui se passe lorsque vous ne
J'ai encore juste de recevoir la valeur de hachage
user_name = User.select("user_name").where(user_id).first
?J'ai encore juste de recevoir la valeur de hachage
OriginalL'auteur yellowreign | 2012-03-03
Vous devez vous connecter pour publier un commentaire.
BTW, si la question est à propos de ActiveRecord::Relation c'est la classe de l'objet renvoyé par où et sélectionnez comme il est dit dans le Guide Rails vous êtes en train de lire.
Il est optimisé pour être enchaînées entre plusieurs méthodes et vous obtenez le modèle d'objet lorsque vous fait accéder à un élément de l'association (donc les coulisses de la requête SQL est exécutée une seule fois). Cela signifie que vous obtenez la Relation d'objet, car vous venez de le retourner.
Dans ce cas, peut-être que la meilleure solution est de simplement utiliser le trouver et l'accès à la user_name attribut
La requête obtiendrez tous les autres attributs de la DB, mais vous serez de retour juste le nom d'utilisateur.
Cela permettra de récupérer l'ensemble de la ligne de la base de données et les rails pour instancier le modèle complet de l'objet - si vraiment vous voulez juste le nom, c'est beaucoup plus efficace d'utiliser
pluck
oufirst
, comme d'autres réponses ont suggéré.Vous avez raison DaveMongoose, voir mon autre réponse.
Ne pas le faire..
OriginalL'auteur Aldo 'xoen' Giambelluca
Devriez faire ce que vous essayez de faire.
plumer "accepte un nom de colonne comme argument et retourne un tableau de valeurs de la colonne spécifiée avec le type de données correspondant"
pluck
a été introduit dans les Rails 3.2.Je voudrais ajouter un
.limit(1)
à cette requête après lawhere
sinon vous allez tirer tous les résultats de la base de données en mémoire.Pas de réel besoin pour la limite de 1 parce qu'il y a vraiment une très petite chance que le champ id de requête retourne plus d'un enregistrement de toute façon.
Dans le code ci-dessus,
.first
ne pas faire unlimit(1)
, parce que ce n'est pas leActiveRelation#first
appel d'une méthode, c'estArray#first
d'être appelé.ActiveRelation#pluck
retourne un tableau (pas un autreActiveRelation
objet). Si vous étiez en appelantActiveRelation#first
, alors oui, il ferait unlimit(1)
. Si tu voulais vraiment que dans l'exemple ci-dessus, vous auriez besoin deUser.where(:id => user_id).limit(1).pluck(:user_name).first
.OriginalL'auteur Aldo 'xoen' Giambelluca
Vous devez ajouter
.first
à la force, la requête retourne un enregistrement car unwhere
renvoie uniquement un activerecord relation.OriginalL'auteur David
Votre problème n'est pas la
select
, c'est lawhere
. Votre état de droit est maintenant essentiellementWHERE #{user_id}
. Si vous avez exécuté ce sur les Rails de la console, vous devriez voir quelque chose comme ceci:Vous avez besoin pour passer les conditions d'un algorithme de hachage pour
where
, et de prendre le premier enregistrement que d'autres ont suggéré de:OriginalL'auteur Brandan
Ressemble à ça tout en ne renvoyant pas tous les champs de la requête ne retourne un objet plutôt que de le domaine spécifique de la valeur. Vous pouvez modifier le retour de
return user_name
àreturn user_name.user_name
.Ou vous pourriez voir si
User.user_name.where(user_id).first
fait ce que vous avez besoin.OriginalL'auteur ScottJShea
il existe une méthode appelée "plumer" font référence http://apidock.com/rails/ActiveRecord/Calculations/pluck
OriginalL'auteur prasad.surase