在支架导轨中查找内容

时间:2019-07-20 02:58:58

标签: ruby-on-rails ruby

因此,我有一个名为@gases的变量,其中包含诸如一氧化碳[CO],二氧化碳[CO2]之类的气体元素。现在,如果有人在搜索功能中搜索CO,则会首先显示二氧化碳[CO2]。所以我想知道我是否可以做这样的事情

where("(lower(gas_analytes.gas)\[.*?\]) LIKE lower(?)", "#{gas_analyte}")

所以上面的代码,如果某人只搜索元素而不是整个内容,我使用了\[.*?\],所以如果搜索输入等于括号中的元素,但这是行不通的。

有什么我可以做的吗?

2 个答案:

答案 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