我经常在Rails应用程序中使用filterrific gem(目前是5.2.3),我很喜欢它。我遇到了一个奇怪的问题。我有一个次要的Postgres数据库供我的开发团队作为Heroku中的附加组件写入。我的filterrific设置在生产中对我所有的范围过滤器都很好,但是搜索返回错误。在开发中,我的SQL种子数据可以完美地工作。
- Model. rb**
filterrific(
default_filter_params: { },
available_filters: [
:sorted_by,
:with_search_please,
:with_manufacturer,
:with_boot_type,
:with_firm,
:with_monitor_count,
:with_ethernet_count,
],
)
scope :with_search_please, ->(search_string) {
return nil if search_string.blank?
terms = search_string.to_s.downcase.split(/\s+/)
terms = terms.map { |e|
#('%' + e + '%').gsub(/%+/, '%')
('%' + e.gsub('*', '%') + '%').gsub(/%+/, '%')
}
num_or_conds = 6
self.where(
terms.map { |term|
"(
LOWER(Terminals.Model) LIKE ?
OR LOWER(Terminals.TermcapModel) LIKE ?
OR LOWER(Manufacturers.Name) LIKE ?
OR LOWER(TerminalType.Type) LIKE ?
OR LOWER(Note.Description) LIKE ?
OR LOWER(FirmwarePackage.Version) LIKE ?
)"
}.join(' AND '),
*terms.map { |e| [e] * num_or_conds }.flatten
)
.joins(:Manufacturers).references(:ManufacturerIds)
.joins(:TerminalType).references(:TypeIds)
.includes(:Notes).references(:TerminalIds)
.joins(:FirmwarePackages).references(:TerminalFirmwarePackages)
}
- 日志错误**
Completed 500 Internal Server Error in 15ms (ActiveRecord: 3.2ms | Allocations: 6057)
2023-09-07T12:56:11.955033+00:00 app[web.1]: F, [2023-09-07T12:56:11.954949 #2] FATAL -- : [9e6cf5c0-457c-47aa-9099-a5923e41b1ce]
2023-09-07T12:56:11.955035+00:00 app[web.1]: [9e6cf5c0-457c-47aa-9099-a5923e41b1ce] ActionView::Template::Error (PG::UndefinedTable: ERROR: missing FROM-clause entry for table "terminals"
2023-09-07T12:56:11.955035+00:00 app[web.1]: LINE 2: LOWER(Terminals.Model) LIKE '%a%'
2023-09-07T12:56:11.955036+00:00 app[web.1]: ^
我尝试了几种重写搜索查询的方法,剥离条件,甚至只是一个简单的SQL查询。这是特别困难的,因为一切都在开发中顺利工作,而所有的过滤作用域都在生产中工作。我知道这一定与二级附加数据库有关,因为我以前从未遇到过这种情况。
1条答案
按热度按时间dgjrabp21#
您的问题是“终端”表不是查询的一部分。
另外请注意Postgres双引号标识符是区分大小写的,例如:“终端”和“终端”。
如果你发布了整个查询以及一些关于这个代码块定义的上下文,我们可能能够提供帮助。
话虽如此,我也想借此机会帮助你清理查询有点,因为它似乎非常尴尬,海事组织。
从这篇文章中可以看出,你的目的是寻找:“一个记录,其中搜索字符串中的每个单词都包含在以下列之一:Terminals.Model、Terminals.TermcapModel、Manufacturers.Name、TerminalType.Type、Note.Description、FirmwarePackage.Version”。
我们可以用更简单的方式实现这一点(并可能在此过程中解决您的问题),如下所示:
例如,如果search_string为“A Sun*ny Day”,这将导致一个类似于
我们也可以用全文搜索来进一步研究。