好吧,如果我只是粘贴代码然后解释
,那么最好 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,'。在这些条件下我必须做什么才能插入额外的单引号?
或者我应该以其他方式做到这一点?
非常感谢你的回答!
答案 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
创建复杂的查询。