1

実際、私は MrJoshi からこの検索クエリを持っています。ここに関連する質問があります: Search query for (name or forname) 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

この検索クエリの問題は、多くのレコードが返されることです。たとえば、誰かがこの検索クエリを検索している場合、を含むすべてのレコードと を含むすべてのレコードJohn Smithが返されますが、検索クエリと完全に一致する人は 1 人しかいない ため、コードを少し変更しました。forename Johnname Smithname is Smith and forename is John

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 

しかし、今、私はこのエラーが発生します:

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

私は何を間違えましたか?ありがとう!

4

0 に答える 0