web-dev-qa-db-fra.com

Rails: comment trouver_par un champ contenant une certaine chaîne

J'ai un modèle nommé Topic, qui a un nom comme champ.

Alors disons que j'ai un terme que je recherche, Apple.

Si je fais un

Topic.find_by_name("Apple")

Je reçois un record avec le nom Apple. C'est bien - mais comment puis-je changer find_by_name afin qu'il puisse trouver "Jus de pomme" ainsi que "Apple" - en gros, trouver des noms qui contiennent la requête d'origine ou correspondent exactement à la requête d'origine?

Modifier: Merci pour toutes les réponses. Je suppose que j'aurais dû être un peu plus clair plus tôt, mais que se passe-t-il si je veux trouver par un nom de variable (évidemment, je ne veux pas le trouver par le nom "Apple" à chaque fois :))?

Comment puis-je manipuler Topic.where pour s'adapter à cela? Donc quelque chose comme ...

@topic = Topic.where(......., @name)
58
varatis

Je pense que quelque chose comme ça devrait fonctionner:

Topic.where("name like ?", "%Apple%")

Pour accueillir votre montage:

Topic.where("name like ?", "%#{@search}%")

Interpolation de chaîne de base, vous utilisez la valeur de @search à l'intérieur de la chaîne %%, donc vous @search = "Apple" alors vous vous retrouvez avec %Apple%

116
Deleteman

On dirait que dans Rails vous voudriez utiliser où:

Topic.where("name ILIKE ?", "%Apple%")
10
ScottJShea

Avec PostgreSQL, vous pouvez également utiliser opérateurs de correspondance :

Topic.where("name ~* ?", @search)
8
Szymon Rut

Ne mettez pas de chaîne directement comme ça. Son appelé injection SQL. Vous devriez plutôt utiliser .where:

Topic.where("name like '?%' ", params[:name])
8
Alisher Ulugbekov

Essayer

Topic.where("name like ?",'%Apple%')
Topic.find(:all, :conditions => ["name like ?","%Apple%"])
1
asitmoharna