Better search query for two columns forename and n

2019-07-23 10:52发布

问题:

Actually i have this search query from MrJoshi here is the associated question: Search query for (name or forename) and (name forname) and (forname name)

def self.search(query)
  return where('FALSE') if query.blank?

  conditions = []
  search_columns = [ :forname, :name ]

  query.split(' ').each do |word|
    search_columns.each do |column|
      conditions << " lower(#{column}) LIKE lower(#{sanitize("%#{word}%")}) "
    end
  end

  conditions = conditions.join('OR')    
  self.where(conditions)
end

The problem with this search query is that it returns way to much records. For example if somebody is searching for John Smith this search query returns all records wih the forename John and all records with the name Smith although there is only one person that exactly matches the search query means name is Smith and forename is John So i changed the code a little bit:

def self.search(query)
  return where('FALSE') if query.blank?

  conditions = []

  query2 = query.split(' ')

  if query2.length == 2
      conditions << " lower(:forname) AND lower(:name) LIKE ?', lower(#{sanitize("%#{query2.first}%")}) , lower(#{sanitize("%#{query2.last}%")})"
      conditions << " lower(:forname) AND lower(:name) LIKE ?', lower(#{sanitize("%#{query2.last}%")}) , lower(#{sanitize("%#{query2.first}%")})"
  else
    search_columns = [ :forname, :name ]
       query2.each do |word|
        search_columns.each do |column|
         conditions << " lower(#{column}) LIKE lower(#{sanitize("%#{word}%")}) "
        end
       end
  end

  conditions = conditions.join('OR')    
  self.where(conditions)
end 

But now i get this error:

SQLite3::SQLException: near "', lower('": syntax error: SELECT  "patients".* FROM "patients"  WHERE ( lower(:forname) AND lower(:name) LIKE ?', lower('%John%') , lower('%Smith%')OR lower(:forname) AND lower(:name) LIKE ?', lower('%Smith%') , lower('%John%')) LIMIT 12 OFFSET 0

What did i wrong? Thanks!