所以我有一个变量,叫做@ CO2,它包含气体元素,比如一氧化碳,二氧化碳,一氧化碳。现在,如果有人在搜索功能中搜索CO,二氧化碳CO2会首先出现。所以我想知道我是否能做这样的事情
where("(lower(gas_analytes.gas)\[.*?\]) LIKE lower(?)", "#{gas_analyte}")所以上面的代码,如果有人只搜索元素而不是整个内容,我使用了\[.*?\],所以如果搜索输入等于括号中的元素,但这不起作用。
有什么类似的我可以做的吗?
发布于 2019-07-20 12:10:18
我可能只是将方括号添加到搜索模式中,如下所示:
where("lower(gas_analytes.gas) LIKE ?", "%[#{gas_analyte.downcase}]%")请注意,如果gas_analyze可能包含%字符,则应在使用该字符串之前对其进行清理:
where("lower(gas_analytes.gas) LIKE ?", "%[#{sanitize_sql_like(gas_analyte.downcase)}]%")因为like非常慢,所以您可以考虑拆分字符串并将缩写提取到数据库列中。这将大大缩短查询时间。
发布于 2019-07-20 12:10:05
以下代码适用于我的(我使用的是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
https://stackoverflow.com/questions/57121466
复制相似问题