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

fengfans · 发布于 2015年12月12日 · 最后由 fengfans 回复于 2015年12月13日 · 875 次阅读
1781

数据库中有如下表:

def search

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


end

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

共收到 11 条回复
E0fcf5
class Niu < ActiveRecord::Base
  ...
  scope :search, -> (q) { where(column_names.map{|n| "#{n}=:q"}.join(' or '), q: q) }
  ...
end
3790

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

1781

代码插入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) }
E0fcf5

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

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

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

1781

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

1781

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

E0fcf5

你要的是模糊匹配吧

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

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

1781

非常感谢!非常感谢 !

1781

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

1781

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

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