2017-09-25 1 views
-1

J'ai une variable str qui contient une chaîne comme The ruby et il trouvera des résultats basés sur cela.Plusieurs mots dans l'opérateur LIKE sql

User.where('abc LIKE :q OR xyz LIKE :q ', q: "%#{str}%") 

Bien qu'il fonctionne bien, je suis coincé sur ce qu'il faut faire si la variable str contient un tableau comme str = [ « La », « rubis »]

je peux courir une boucle mais il va créer plusieurs requêtes et je ne veux pas ça. Peut-il être fait dans le même code?

Je sais que si je dois tester plusieurs mots, alors je dois faire quelque chose comme ça

User.where('abc LIKE :q OR abc LIKE :r OR xyz LIKE :q OR xyz LIKE :r ', q: "%#{str[0]}%", r: "%#{str[1]}%") 

Juste par exemple, je l'ai utilisé la valeur 2 dans le tableau, mais en réalité, il pourrait être d'une longueur quelconque.

S'il vous plaît laissez-moi savoir si je fais droit

Répondre

1

Comme vous pensiez au départ, vous pouvez simplement faire une boucle pour créer plusieurs requêtes. Vous ne sont cependant pas nécessaire d'exécuter les requêtes séparément, vous pouvez les joindre à faire en une seule instruction SQL en utilisant or:

examples = ['The Ruby', ['The', 'Ruby']] 

examples.each do |search| 
    queries = Array(search).map do |search_term| 
    User.where('category_title LIKE :q OR title LIKE :q OR description LIKE :q OR tag_list LIKE :q', q: "%#{search_term}%") 
    end 

    statement = queries.reduce do |statement, query| 
    statement.or(query) 
    end 

    puts statement.to_sql 
end 

La sortie de ce qui est (nettoyé un peu, bien sûr):

SELECT "users".* FROM "users" 
WHERE (category_title LIKE '%The Ruby%' OR title LIKE '%The Ruby%' 
    OR description LIKE '%The Ruby%' OR tag_list LIKE '%The Ruby%') 

SELECT "users".* FROM "users" 
WHERE ((category_title LIKE '%The%' OR title LIKE '%The%' OR 
      description LIKE '%The%' OR tag_list LIKE '%The%') OR 
     (category_title LIKE '%Ruby%' OR title LIKE '%Ruby%' OR 
      description LIKE '%Ruby%' OR tag_list LIKE '%Ruby%')) 
+0

cela a fonctionné mais existe-t-il un moyen d'éviter de faire plusieurs requêtes? – Raaz

+0

Cela n'exécutera qu'une seule requête, si quelque chose avait été exécuté sur la base de données, mon script aurait commencé à crier à propos de tout parce que ces colonnes n'existent pas sur mon modèle utilisateur. –

+0

désolé vous avez raison. Je peux le voir seulement fait un req. – Raaz

0

Vous pouvez y parvenir avec une requête simple à l'aide ILIKE

str = ["The","Ruby"].map {|val| "%#{val}%" } 

Video.where("category_title ILIKE ANY (array[?]) OR title ILIKE ANY (array[?]) OR description ILIKE ANY (array[?]) OR tag_list ILIKE ANY (array[?])", str, str, str, str) 

Il travaille pour moi.

À la votre!

+0

Erreur ActiveRecord :: StatementInvalid: Mysql2 :: Erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'ILIKE ANY (array ['% Le% ','% Ruby% ']) OU titre ILIKE ANY (array ['% The% ',' % Ruby% '' à la ligne 1: SELECT 'videos'. * FROM' vidéos' O WH (category_title ILIKE ANY (array ['% Le%', '% Ruby%']) OU titre ILIKE ANY (array ['% % ','% Ruby% ']) OU description ILIKE ANY (array ['% Le% ','% Ruby% ']) OR tag_list ILIKE ANY (array ['% Le% ','% Ruby% '])) LIMIT 11 – Raaz

1

Désolé si cette réponse est jugée un peu hors sujet, mais il existe des moyens beaucoup plus efficaces pour interroger les informations demandées par le PO plutôt que de le forcer et de chaîner beaucoup de requêtes LIKE.

Quel moteur de base de données utilisez-vous, @Raaz? Plusieurs jetons semblent être un bon cas d'utilisation pour les requêtes POSIX Regular Expression. Par rapport à une requête LIKE, qui ne recherche que 1 jeton à la fois, l'utilisation de la correspondance de modèle vous permettrait de rechercher un nombre quelconque de jetons dans une seule requête avec seulement quelques clauses WHERE.

Les deux Postgres et MySQL peuvent interroger à l'aide de modèles.

Pour Postgres, il ressemblerait à quelque chose comme cet extrait de code non prouvé:

Video.where("category_title SIMILAR TO '%(the|ruby)%'" 

Une autre option que vous utilisez Postgres suppose, est d'utiliser la pierre précieuse pg_search et effectuer une recherche multisearchable sur votre base de données. Vous pouvez interroger ces quatre champs en même temps et la base de données fera tout le travail. Encore une fois, cela suppose que vous utilisez une base de données Postgres.

+0

Désolé, j'aurais dû préciser que j'utilise mysql – Raaz