2010-01-07 6 views
0

ok, donc probablement mieux si je coller simplement le code et expliquervariables insertion dans des conditions find => requête SQL

search = "your horses" 

    exp1 = "" 
    exp2 = "" 

    myarray = search.split(/ /) 
    mylength = myarray.length   #this would return 2 in this case 

    mylength.times do 
    exp1 += "AND name LIKE ? "   #this gives--> AND name LIKE ? AND name LIKE ? 
    end 

    for i in 0..(mylength - 1) 
    exp2 += ("%#{myarray[i]}%, ") #and this gives--> your, horses, 
    end 

find(:all, :conditions => ["#{exp1}", exp2]) 

et ici à la fin je reçois un problème parce que exp2 devient « votre, chevaux, » à l'intérieur de la fonction de recherche. que dois-je faire dans ces conditions, il n'y aurait pas de guillemets simples ajoutés? Ou peut-être que je devrais le faire d'une autre manière?

merci beaucoup pour vos réponses!

Répondre

2
search = "your horses" 
    myarray = search.split(/ /) 
    mylength = myarray.length  
    find(:all, :conditions => [myarray.map{|x| 'name like ?'}.join(' AND '), *(myarray.map{|x| "%#{x}%"})]) 
+0

sincèrement merci encore – user235195

0

Je ne sais pas comment écrire ceci dans Ruby, mais en règle générale lors de la compilation des valeurs séparées par des virgules, je l'ai trouvé plus facile de mettre la virgule au début lorsque vous apposent comme ceci:

var = ''; 

var += ',name1'; 
var += ',name2'; 
var += ',name3'; 

print substring(var, 1); 

Cela a toujours été plus facile pour moi, plutôt que d'essayer de détecter la virgule supplémentaire et de la couper de la fin. Heureusement, il y a une commande de sous-chaîne dans Ruby. :)

1

Essayez de supprimer votre dernière for bloc et de faire ceci: "?"

find(:all, :conditions => [exp1, *exp2]) 

Cela devrait mettre votre remplacements dans les éléments finaux du tableau, qui est la syntaxe Rails correcte.

(De plus, aucune idée pourquoi vous avez converti exp1, une chaîne, dans une chaîne par lui-même interpoler - "#{expr1}" est le même que expr1.)

1

Je l'ai utilisé une technique de compilation d'un ensemble de conditions puis progressivement l'alimentation que par l'appel à de nombreuses reprises trouver un il fonctionne particulièrement bien pour ce genre de chose:

search = "your horses" 

# Establish a template conditions set 
conditions = [ [ ] ] 

# For each part of the name, add an element 
# to the conditions. 
search.split(/\s+/).each do |name| 
    conditions[0] << 'name LIKE ?' 
    conditions << "%#{name}%" 
end 

# Collapse the array into a single string 
conditions[0] = conditions[0].join(' AND ') 

# Run the query 
find(:all, :conditions => conditions) 

la clé est de commencer par un tableau vide avec un seul tableau vide en elle. Les conditions WHERE sont ajoutées au premier élément et les espaces réservés sont ajoutés aux conditions générales Array.

Ceci est flexible dans la mesure où vous pouvez choisir d'utiliser OU ou ET selon les besoins et lorsqu'il est augmenté avec des étendues nommées, peut faire encore plus de choses.

0

Je sais que c'est déjà répondu, mais vous cherchez plusieurs mots sur un nom, n'est-ce pas?

Dans ce cas, je pense que vous pouvez faire la requête SQL avec juste une condition LIKE. En d'autres termes:

search = "your horses" 
searchWithPercents = "%#{search.split.join('%')}%" # --> '%your%horses%' 
find(:all, :conditions => ['name LIKE ?', searchWithPercents]) 

Pas besoin de créer une requête complexe avec ANDS.

Questions connexes