首页 > 解决方案 > Ruby on Rails - 生产模式 - 搜索不是在寻找内容的第一个字母

问题描述

我的应用程序中有一个搜索页面。在开发模式下,它正在按应有的方式工作。但是当我在生产模式下尝试时,一些结果丢失了。在生产模式下,搜索不会在搜索时检查第一个字母。我认为这可能是因为我以某种方式更改了搜索词,但我检查了它并没有问题。

这是我的模型相关范围:

scope :anime_list, -> { where(category: 'anime') }
scope :manga_list, -> { where(category: 'manga') }
scope :name_contains, -> (term) { where('name LIKE ?', "%#{term}%") }
scope :tag_contains, -> (term) { where('tags LIKE ?', "%#{term}%") }
scope :search, ->(search_term) { name_contains(search_term).or(tag_contains(search_term)) }

这是我的相关搜索操作:

@search_term = params[:q]
if(@search_term)
  @animes = Content.all.search(@search_term).anime_list
  @mangas = Content.all.search(@search_term).manga_list
end

例如; 我的应用程序中有动漫和漫画,您可以通过它们的名称或标签搜索它们。我有《火影忍者》、《弗兰克斯的宠儿》。当我输入“na”作为搜索词时。只有“Darling in the Franxx”正在显示。如果我要搜索“aru”之类的东西,火影忍者也会显示。

当我用相同的搜索词进行搜索时,我检查了生产和开发模式的日志,它们是相同的。我的问题是,如何将第一个字母添加到搜索中?

标签: ruby-on-rails

解决方案


发生这种情况是因为LIKESqlite 中的运算符区分大小写,而 Postgres 不区分大小写。

您可以通过使用ILIKEPostgres 中的运算符来解决此问题,从而使搜索工作的情况也变得不敏感。

scope :name_contains, -> (term) { where('name ILIKE ?', "%#{term}%") }

作为旁注,我建议在开发中使用与生产中相同的数据库,这将为您省去很多麻烦。


推荐阅读