将变量插入查找条件=> SQL查询

时间:2010-01-07 20:37:05

标签: ruby-on-rails ruby

好吧,如果我只是粘贴代码然后解释

,那么最好
   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在find函数中变成了'your,horses,'。在这些条件下我必须做什么才能插入额外的单引号?

或者我应该以其他方式做到这一点?

非常感谢你的回答!

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

尝试删除上一个for块并改为执行此操作:

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

这应该把你的“?”替换为数组的最终元素,这是正确的Rails语法。

(另外,不知道为什么你通过插入自己将exp1,一个字符串转换为字符串 - "#{expr1}"expr1.相同)

答案 2 :(得分:1)

我使用了一种逐步编译一组条件的技术,然后在很多情况下将它传递给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,当使用命名范围进行扩充时,可以做更多的事情。

答案 3 :(得分:0)

我不知道如何在Ruby中编写这个,但是作为编译逗号分隔值的一般规则,我发现当你这样追加时,最简单的把逗号放在开头:

var = '';

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

print substring(var, 1);

这对我来说一直比较容易,而不是试图检测额外的逗号并将其删除。希望Ruby中有一个substring命令。 :)

答案 4 :(得分:0)

我知道这已经回答了,但是你正在寻找一个名字上的几个字,不是吗?

在这种情况下,我认为您可以使用一个 LIKE条件来执行SQL查询。换句话说:

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

无需使用ANDS创建复杂的查询。