99 votes

Rails: Comment trouver par un champ contenant une certaine chaîne

Je possède un modèle nommé Topic, qui a un champ nom.

Donc disons que j'ai un terme que je recherche, pomme.

Si je fais un

Topic.find_by_name("pomme")

Je reçois un enregistrement avec le nom pomme. C'est bien -- mais comment puis-je modifier find_by_name pour qu'il puisse trouver "jus de pomme" ainsi que "pomme" -- essentiellement, trouver des noms qui contiennent la requête initiale ou correspondent exactement à la requête initiale?

Éditer : Merci pour toutes les réponses. J'imagine que j'aurais dû être un peu plus clair plus tôt, mais que faire si je veux trouver par un nom de variable (évidemment je ne vais pas vouloir trouver par le nom "pomme" à chaque fois :) )?

Comment manipuler Topic.where pour accommoder cela? Donc quelque chose comme...

@topic = Topic.where(......., @nom)

186voto

Deleteman Points 3879

Je pense que quelque chose comme ceci devrait fonctionner:

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

Pour tenir compte de votre modification:

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 si vous faites @search = "apple" alors vous obtenez %apple%

17voto

Szymon Rut Points 647

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

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

12voto

ScottJShea Points 4309

Il semble que dans Rails 3, vous voudriez utiliser le where:

Topic.where("name ILIKE ?", "%apple%")

12voto

Alisher Ulugbekov Points 434

Ne mettez pas de chaîne directement comme ça. C'est ce qu'on appelle une injection SQL. Vous devriez plutôt utiliser .where :

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

2voto

asitmoharna Points 679

Essayer

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X