Rails: Comment find_by un champ contenant une certaine chaîne de caractères
J'ai un modèle nommé Thème, qui a un nom en tant que champ.
Donc, dis-je avoir un terme, je suis à la recherche pour, apple.
Si je fais un
Topic.find_by_name("apple")
- Je obtenir un enregistrement avec le nom apple. C'est bon, mais comment puis-je changer find_by_name de sorte qu'il peut trouver le "jus de pomme" ainsi que "apple" - en gros, trouver les noms qui contiennent la requête d'origine ou de correspondre exactement à la requête d'origine?
Edit:
Merci à tous pour la réponse. Je suppose que je devrais avez été un peu plus clair plus tôt, mais si je veux trouver un nom de variable (évidemment, je ne vais pas vous voulez trouver par le nom de "pomme" à chaque fois 🙂 )?
Comment puis-je manipuler Sujet.où loger pour cela?
Donc, quelque chose comme...
@topic = Topic.where(......., @name)
- Ajout d'une édition à ma réponse concernant votre dernière modification, laissez-moi savoir si ça peut aider!
- Voir mon commentaire de @Alicher de la réponse pour répondre à votre édité question.
Topic.where("name like ?","#{@name}%")
serait un moyen.
Vous devez vous connecter pour publier un commentaire.
Je pense que quelque chose comme cela devrait fonctionner:
Pour accueillir pour vos edit:
Chaîne de base de l'interpolation, vous êtes à l'aide de la valeur de
@search
à l'intérieur de la chaîne de%%
, de sorte que vous@search = "apple"
puis vous vous retrouvez avec%apple%
where
méthode ne fait rien pour protéger contre les injections SQL. Cependant, la question con être répondu par d'examiner si cette variable est jamais exposé à la saisie de l'utilisateur, soit par le biais d'un stockées unsanitized valeur, ou directement. Que devrait être la question de l'intérêt. Le meilleur moyen de lutter contre l'injection SQL consiste à désinfecter les valeurs d'entrée de l'application, même avant le stockage.Ressemble en Rails 3 vous souhaitez utiliser le où:
~=
opérateur travaille pour PostgreSQL -- c'est une regex match. Mais ouais, Scott réponse devrait fonctionner. Vous pouvez utiliser ILIKE, ce qui donne une casse de recherche.Ne mettez pas de chaîne directement comme ça. Son appelé injection SQL. Vous devez utiliser à la place
.where
:%
avant la substitution, par exempleTopic.where("name like ?", "#{params[:name]}%").
Avec PostgreSQL, vous pouvez également utiliser match opérateurs:
Essayer
Topic.where("name like ?","%apple%")
. Second est OK.Topic.find_by("name like ?", "%apple%")