因此,我有一个名为@gases的变量,其中包含诸如一氧化碳[CO],二氧化碳[CO2]之类的气体元素。现在,如果有人在搜索功能中搜索CO,则会首先显示二氧化碳[CO2]。所以我想知道我是否可以做这样的事情
where("(lower(gas_analytes.gas)\[.*?\]) LIKE lower(?)", "#{gas_analyte}")
所以上面的代码,如果某人只搜索元素而不是整个内容,我使用了\[.*?\]
,所以如果搜索输入等于括号中的元素,但这是行不通的。
有什么我可以做的吗?
答案 0 :(得分:1)
我可能会像这样在搜索模式中添加方括号:
where("lower(gas_analytes.gas) LIKE ?", "%[#{gas_analyte.downcase}]%")
请注意,如果gas_analyze
可能包含%
个字符,则应在使用该字符串之前对其进行清理:
where("lower(gas_analytes.gas) LIKE ?", "%[#{sanitize_sql_like(gas_analyte.downcase)}]%")
由于like
的运行速度很慢,因此您可以考虑将字符串拆分并自行将缩写提取到数据库列中。这样可以大大缩短查询时间。
答案 1 :(得分:0)
此代码适用于我的代码(我正在使用SQLite数据库):
# seeds.rb
# Type `rake db:seed` in terminal to run this file
# GasAnalyte.destroy_all
10.times do |t|
GasAnalyte.create!(
gas: "#{SecureRandom.uuid} [CO2]"
)
end
p ['All', GasAnalyte.all].inspect
p ['Searching for "CO"', GasAnalyte.search_gas("CO")].inspect
# gas_analyte.rb
class GasAnalyte < ApplicationRecord
validates :gas, presence: true
scope :search_gas,
->(gas_analyte) { where("lower(gas_analytes.gas) LIKE lower(?)", "%[#{gas_analyte}%]") }
end
在这里您可以了解有关LIKE运算符的信息:https://www.w3schools.com/sql/sql_like.asp