вставка переменной в условия поиска => запрос SQL - PullRequest
0 голосов
/ 07 января 2010

хорошо, так что, наверное, лучше, если я просто вставлю код, а затем объясню

   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])

и вот в конце я получаю проблему, потому что exp2 становится 'your, horse', внутри функции find Что мне делать, чтобы в этих условиях не было вставлено никаких дополнительных одинарных кавычек?

или, может быть, я должен сделать это по-другому?

Большое спасибо за ваши ответы!

Ответы [ 5 ]

2 голосов
/ 08 января 2010
   search = "your horses"
   myarray = search.split(/ /)
   mylength = myarray.length    
   find(:all, :conditions => [myarray.map{|x| 'name like ?'}.join(' AND '),  *(myarray.map{|x| "%#{x}%"})])
1 голос
/ 08 января 2010

Я использовал метод поэтапной компиляции набора условий, а затем передал его во время вызова find, и он особенно хорошо работает для такого рода вещей:

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)

Ключ должен начинаться с пустого массива с одним пустым массивом в нем. Условия WHERE добавляются к первому элементу, а заполнители добавляются к массиву общих условий.

Это гибко, поскольку вы можете использовать OR или AND по мере необходимости, а при расширении именованными областями можете делать еще больше вещей.

1 голос
/ 07 января 2010

Попробуйте удалить свой последний for блок и сделайте это вместо:

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

Это должно поставить ваше "?" замены в качестве конечных элементов массива, что является правильным синтаксисом Rails.

(Кроме того, не знаю, почему вы преобразовали строку exp1 в строку путем интерполяции самого себя - "#{expr1}" совпадает с expr1.)

0 голосов
/ 08 января 2010

Я знаю, что на это уже есть ответ, но вы ищете несколько слов в названии, не так ли?

В этом случае я думаю, что вы можете выполнить SQL-запрос только с one LIKE условием. Другими словами:

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

Нет необходимости создавать сложный запрос с ANDS.

0 голосов
/ 07 января 2010

Я понятия не имею, как написать это в Ruby, однако, как правило, при компиляции значений, разделенных запятыми, я считаю, что проще всего ставить запятую в начале, когда вы добавляете так:

var = '';

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

print substring(var, 1);

Мне всегда было легче, чем пытаться обнаружить лишнюю запятую и отрубить ее до конца. Надеюсь, в Ruby есть команда подстроки. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...