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)
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%
On dirait que dans Rails vous voudriez utiliser où:
Topic.where("name ILIKE ?", "%Apple%")
Avec PostgreSQL, vous pouvez également utiliser opérateurs de correspondance :
Topic.where("name ~* ?", @search)
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])
Essayer
Topic.where("name like ?",'%Apple%')
Topic.find(:all, :conditions => ["name like ?","%Apple%"])