新手问题 如何在单表的所有字段中,查询包括关键词的所有记录

fengfans · 2015年12月12日 · 最后由 fengfans 回复于 2015年12月13日 · 2445 次阅读

数据库中有如下表:

def search

    @room = Niu.where(params[:q]).all


end

search 方法中的查询条件该如何设定,能够在这个表中的所有字段中,查询包括这个关键词的所有记录。

class Niu < ActiveRecord::Base
  ...
  scope :search, -> (q) { where(column_names.map{|n| "#{n}=:q"}.join(' or '), q: q) }
  ...
end

感觉你的需求,最好用个全文搜索引擎来弄,效率高点。不过貌似一楼的方案也可,值得一试。

代码插入 model 后,前台出现这样的报错。

SyntaxError in NiusController#index

/home/f/railscode/excel/app/models/niu.rb:18: syntax error, unexpected tLPAREN_ARG, expecting keyword_do_LAMBDA or tLAMBEG
 scope :search, -> (q) { where(column_names.map{|...
                    ^
/home/f/railscode/excel/app/models/niu.rb:18: syntax error, unexpected tLAMBEG, expecting keyword_end
 scope :search, -> (q) { where(column_names.map{|n| "...
                        ^
/home/f/railscode/excel/app/models/niu.rb:18: syntax error, unexpected '}', expecting keyword_end

我的代码是这样的写的,相关的语法在哪里能够查到?请指教一二,错在哪里了?

scope :search, -> (q) { where(column_names.map{|n| "#{n}=:q"}.join(' or '), q: q) }

看来你的 ruby 版本是 2.0 以下的,把 -> 和 (q) 中间的空格去掉就可以了

scope :search, ->(q) { where(column_names.map{|n| "#{n}=:q"}.join(' or '), q: q) }

看来都怪平时习惯太好,我都没发现还有这语法错误。

非常感谢,老问题都解决了,但我比较笨,新问题出现了。我输入 room 字段的值,有返回结果,但是输入其他列中的关键词,就没有返回空值。例如:网络,141 等。

还有,这些语法的说明在哪里能够查到?我打开指南与 api 文档,无从下手呀。

你要的是模糊匹配吧

scope :search, ->(q) { where(column_names.map{|n| "#{n} like :q"} * ' or ', q: "%#{q.strip}%") }

模糊匹配查询是比较耗时的,而且索引也不会生效,要是数据量大,建议像 @qinfanpeng 说的用全文搜索, 推荐 https://github.com/ankane/searchkick

非常感谢!非常感谢!

我没有调试明白,还是听从你的建议,用 gem 吧。不过,弱弱的问一句,将复杂多维的 excel 表格转换至数据库中,成为结构化的数据表,有没有更高效更简便的 gem。嘻嘻。。。。。

@falm 非常感谢!非常感谢!这个 gem 太牛了,速度 ms 级。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号