Rails 介绍一个搜索/过滤有关的 gem: rails-simple-search

yzhang · 2012年12月16日 · 最后由 stephen 回复于 2014年05月31日 · 4502 次阅读

rails-simple-search 是一个 Ruby gem. 它可以帮助你为你的网站快速实现搜索/过滤功能。在输出结果中它还可以帮助分页。如果你不需要一个全文搜索的功能,这个 gem 很可能就是你需要的。

以前,我时常需要实现一个页面来显示从一个数据库表里面根据条件搜索出来的纪录。在我实现这个 gem 之前,我通常是这样实现的:

在 view 里面使用 <%= form_tag %> 来构造一个 form。用<%= text_field_tag %> 或其他的 html input 来输入搜索条件

在 controller 里面,把搜索条件从 params 里面拿出来,放到 instance variable 里面。这些 instance variables 在 view 里面可以用到。

构造 SQL 的 WHERE 子句。根据搜索条件的不同,有时还需要用到 JOIN。

用上面构造的 WHERE 和 JOIN 子句,运行 find(:all, :conditions => [xxxxxx], :joins => “yyyyyy”)

在使用上面的 pattern 多次以后,我意识到我可以把这个 pattern 做到一个 library 里面。以上就是 rails-simple-search 的由来。

现在,实现这样功能的一个页面就非常简单了。你可以从下面的例子里看出这是多么的简单。。。

更多内容在这里: https://github.com/yzhanginwa/rails-simple-search

有一个使用本 gem 的例子 RoR 项目在这里:https://github.com/yzhanginwa/demo_app_for_rails_simple_search

@yzhang ,今天测试了下你的 gem,很好用,觉得这类搜索适合于管理端管理数据时的数据搜索情况

现实的情况是,我还经常需要根据用户的注册时间来查询用户,这个可能需要在页面有两个输入框,一个是开始时间,一个是结束时间,只查询在这个时间段内注册的用户,如果这样的话,你的 gem 就没法用了

#2 楼 @naitnix 等有时间,我可以加入对范围的搜索。谢谢你的测试。

楼主辛苦,支持你一下

#4 楼 @naitnix 刚把最新的版本 rails-simple-search (0.9.5) 上传到 rubygems.org。现在在 view 里面,在需要搜索范围的 field name 后面添上"_greater_than", "_greater_than_or_equal_to", "_less_than", "_less_than_or_equal_to",就可以了。

比如查找一个具体的价格: <%= f.text_field 'price' %>

如果是查找一个价格范围: <%= f.text_field 'price_greater_than_or_equal_to' %> 和 <%= f.text_field 'price_less_than_or_equal_to' %>

我做了简单的测试,工作正常。

@yzhang ,太感谢你了,我一会儿测试下,辛苦!

@yzhang ,我将你的 gem 更新到了 0.9.5, 然后在 console 里面测试了下,报错了: sea = {"first_name"=>"gao", "last_name"=>"", "address.address1"=>"", "address.city"=>"", "posts.title"=>"", "posts.body"=>"", "comments.body"=>""} @search = Search.new(User, sea) @search.run 以下是报的错误: undefined method text?' for nil:NilClass 查看log后发现错误在这里: (gem) rails-simple-search-0.9.5/lib/rails-simple-search.rb:148:ininsert_condition' (gem) rails-simple-search-0.9.5/lib/rails-simple-search.rb:193:in parse_attribute' (gem) rails-simple-search-0.9.5/lib/rails-simple-search.rb:111:inblock in run_criteria' (gem) rails-simple-search-0.9.5/lib/rails-simple-search.rb:106:in each' (gem) rails-simple-search-0.9.5/lib/rails-simple-search.rb:106:inrun_criteria' (gem) rails-simple-search-0.9.5/lib/rails-simple-search.rb:59:in `run' 不知道是不是我在 console 里面这么写会不会有问题,在更新这个 gem 之前,everything is ok

#7 楼 @naitnix 谢谢你的测试!我看一下怎么回事。

#7 楼 @naitnix 在 console 里这样写应该没有问题。看起来似乎是某个 field name 在 database 里面不存在。能贴一下文件 db/schema.rb 吗?

@yzhang ,难道你那里能跑通?下面是我的 schema,你可以看一下:

ActiveRecord::Schema.define(:version => 20121219033451) do

create_table "addresses", :force => true do |t| t.string "address1" t.string "address2" t.string "city" t.integer "state" t.string "zip" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false end

create_table "comments", :force => true do |t| t.text "body" t.integer "user_id" t.integer "post_id" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false end

create_table "posts", :force => true do |t| t.string "title" t.text "body" t.integer "user_id" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false end

create_table "users", :force => true do |t| t.string "first_name" t.string "last_name" t.string "email" t.integer "address_id" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false end

end

#10 楼 @naitnix 我这里也跑不了。 :-)

找到了问题。是我 code 里面有一个 typo。已经修好了并 push 到 github 了。rubygems.org 今天是 read only。等晚上我再试试。新的版本是 0.9.6。

@yzhang ,thank you very much

@yzhang @naitnix 请问支持 mangold 不?

#13 楼 @simlegate 没有测试过 mongoid。Rails-simple-search 里面用了一些 SQL,估计和 mongoid 不兼容。在支持 mongoid 之前,需要 refactor 一些 code。

争取在下一个版本开始支持 mongoid。

@yzhang 版本 0.9.7 出现 wrong number of arguments (1 for 0) 错误了!我发了 issue,麻烦看看

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