web-dev-qa-db-fra.com

pouvez-vous utiliser activerecord pour trouver la sous-chaîne d'un champ? (Recherche rapide et sale de mots clés)

Supposons qu'une base de données contienne un champ 'keywords' et que les exemples d'enregistrements incluent: "Clé à pipe" "Clé à molette" "Clé à croissant".

existe-t-il un moyen d'activerecord pour trouver les enregistrements où le champ mot-clé contient la sous-chaîne "croissant"?

(C'est juste une recherche rapide et sale pour un prototype de concept rapide)

38
jpwynn

Oui, utilisez simplement une instruction LIKE dans MySQL.

Dans Rails 2.x:

Table.find(:all, :conditions => ['keywords LIKE ?', '%crescent%'])

Dans Rails 3.x:

Table.where('keywords LIKE ?', '%crescent%').all
76
Pan Thomakos

La syntaxe de la base de données Postgres serait:

YourModelName.where("yourFieldName like ?", "%" + yourSearchTerm + "%")
14
Martin Åhlin

Tout dépend de votre base de données. Est-ce Postgres? MySQL? MongoDB? Rien d'autre?

Avec Postgres, vous pourriez utiliser quelque chose comme:

Rails 2.x => Model.find(:all, :conditions=>["models.keywords ~= ?", 'crescent'])
Rails 3.x => Model.where("models.keywords ~= ?", 'crescent')

Il vous suffit de trouver la syntaxe appropriée pour votre version de DB/Rails/ActiveRecord.

9
christianblais

J'ai eu un problème similaire. J'avais besoin de voir si des mots-clés avaient été passés à partir d'une entrée contrôlée dans le composant frontal dans le corps des questions de mon tableau de questions. Voici comment je l'ai fait dans mon contrôleur: 

   def search
     input = params[:q]
       @questions = Question.all
       search_words = input.split(' ')
       @found_question = [];

       search_words.each do |Word|
         @found_question << Question.where("questions.body LIKE ?", "%#{Word}%")
     end
   end
1
user3916244