忽略搜索中的大写,小写和重音

我这里有一个带filter的搜索系统。 这个系统就像魅力一样,但我有一些问题,包括羽毛/大写和重音。

例如,如果我搜索“marée”我有结果,但如果我搜索“MAREE”或“Marée”或“maree”。 我没有结果。

我想解决这个问题。 我怎么解决这个问题? 谢谢。

我的控制器

def resultnohome if params[:query].blank? redirect_to action: :index and return else @campings = Camping.searchi(params[:query], params[:handicap], params[:animaux], params[:television], params[:plage], params[:etang], params[:lac]) if params[:query] == "aube" @pub = Camping.find_by_id(1) else end end end 

我的模特

  def self.searchi(query, handicap, animaux, television, plage, etang, lac) return scoped unless query.present? result = left_outer_joins(:caracteristiquetests, :situations).where('nomdep LIKE ? OR name LIKE ? OR nomregion LIKE ? OR commune LIKE?', "%#{query}%", "%#{query}%", "%#{query}%", "%#{query}%") result = result.where('handicap LIKE ?', "%#{handicap}%") if handicap result = result.where('animaux LIKE ?', "%#{animaux}%") if animaux result = result.where('television LIKE ?', "%#{television}%") if television result = result.where('plage LIKE ?', "%#{plage}%") if plage result = result.where('etang LIKE ?', "%#{etang}%") if etang result = result.where('lac LIKE ?', "%#{lac}%") if lac return result end 

如果你坚持使用SQLite,那么你没有很多好的选择。 最常见的建议是在数据库中添加额外的列,这些列是标准化值,因此如果您的plage列包含“Marée”,那么您还有一个包含“ plage_ascii ”的列plage_ascii

您需要使用迁移创建其他列,然后您的模型中将有一个before_save操作…

 before_save :create_normalized_strings def create_normalized_strings self.handicap_ascii = handicap.downcase.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s self.animaux_ascii = animaux.downcase.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s # etc etc end 

然后在你的搜索中做…

 if handicap test_handicap = handicap.downcase.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s result = result.where('handicap_ascii LIKE ?', "%#{handicap}%") end 

它并不好,因为它基本上迫使您将数据库中的数据复制到额外的列中。 如果您可以考虑除SQLite之外的更复杂的数据库,那么您会更好……我个人不会在生产环境中使用SQLite。