1

我实现了像http://railscasts.com/episodes/340-datatables上提出的数据表,它工作得很好。不幸的是,它与在输入字段中使用空格进行搜索无关。如果我用搜索功能实现它,用 javascript 处理它就可以了。

所以我想要做的是在数据库中搜索许多字段,其中 sql 的参数被空格(参数的动态大小)分割,例如。“name1 street city” -> 这意味着返回的对象必须在一个对象字段中包含所有三个“name1”、“street”、“city”。

下面是一个例子:Person :name, :address, :city, :country

人(“彼得·梅耶”、“某街 111”、“纽约”、“美国”)

  • 如果用户使用“Peter York”进行搜索,它应该会找到该对象
  • 如果用户用“Peter Los Angeles”搜索它应该找不到任何东西
  • 如果用户搜索“111 Mayer States York”,它应该会找到该对象

好吧,我可以写很多不同的 sql,尊重参数的数量,但这不是很好

有没有简单的方法来解决这个问题?

仅使用第一个参数进行搜索后进行过滤不是一种选择,因为分页不再起作用

4

2 回答 2

0

您可以执行以下操作:

  1. 连接所有必须在一个字符串中找到的属性

    search_attributes = [person.name1, person.address, person.city, person.country].join(' ') 对于您的示例search_attributes将等于"Peter Mayer Some Street 111 New York United States"

  2. 然后遍历查询中的每个字符串并确保在search_attributesusing中找到它.include?,并且仅当在发送的查询中找到所有字符串时才返回记录search_attributes

于 2012-12-29T11:58:54.640 回答
0

我现在是这样做的:

searchData = params[:sSearch].split(" ")

searchString = "1 = 1"
searchParams = {}
i = 0
searchData.each do |searchParam|
    searchString += " AND (persons.name like :search"+i.to_s+" or persons.address like
     :search"+i.to_s+" or persons.city like :search"+i.to_s+" or persons.country like    
     :search"+i.to_s+"+")"

    searchParams["search#{i}".to_sym] = "%"+searchParam+"%"
    i += 1
end

Person.where(searchString, searchParams)
于 2012-12-30T16:46:23.477 回答