- 浏览: 274306 次
- 性别:
- 来自: 尤溪
文章分类
最新评论
-
palytoxin:
我现在也发现是这样
关于分享 -
float2net:
Java社区,分享有利于提高。
关于分享 -
hz_qiuyuanxin:
头晕啊,啊邱
RSpec学习笔记 -
reyesyang:
...
关于分享 -
Hooopo:
一般实现map都先实现each
在 Ruby 中对树状结构(tree)进行 map 操作
发现还有人在看这个博客,这个 SearchLogic 只支持 Rails 2。Rails 3 有一个类似的插件叫 meta search,后来 meta search 又被重新改写,并改名叫 ransack,功能跟 searchlogic 非常相似,如果你在用 Rails 3,推荐使用 ransack。
参考:http://github.com/binarylogic/searchlogic
比较早就在用这个插件了,本来今天想响应蜗牛同学的号召,把这篇http://asciicasts.com/episodes/176-searchlogic给译一下,结果才译到第2句,发现译不下去。。还是乖乖写笔记吧。
Searchlogic是一个功能十分强大使用又很简单的Rails搜索插件。(BinaryLogic出品的两个插件真的很不错:Authlogic和Searchlogic)
安装:
扩展
装上之后,所有的model都被添加上了一系列的类方法(其实是通过method_missing实现的,见源码:http://github.com/binarylogic/searchlogic/blob/master/lib/searchlogic/named_scopes/conditions.rb)
这一系列的方法很容易看懂,直接copy官方的代码吧:
这些方法的返回值都是一个named scope对象,因此你可以把它们串起来使用:
完整的条件(conditions)列表见Searchlogic::NamedScopes::Conditions中的常量。
别名
作者说了,输入长长的“greater_than_or_equal_to”一点也不好玩,所以作者又为searchlogic添加了一系列别名:
这些还不是searchlogic强大的地方。
searchlogic还可以搜索关联的对象(关联的数据库表),很简单:
wow 你一定已经惊呼了,不过还早。
自定义的named scope
因为这些方法的返回值都是named_scope,所以还可以这样用:
多态关联
更强大的来了:
searchlogic为多态关联也提供了很好的支持:
方法的格式有点特别,包含了这样的格式的前缀:
[多态关联的名字]_[关联的类型]_type
不过还是比较好懂的,只要给关联起个好名字,读起来还是很DSL的
强吧?还早还早
all 和any
or的使用
注意,你并不需要每次都清楚的加上条件(例如gt、lt、begins_with等)。你只需要在结尾的部分指定。如果你在一个字段名后面加上另一个字段名,那么对这两个字段都将使用后面的条件。所以:
可以写成这样:
Make searching and ordering data in your application trivial
差不多已经可以使用Searchlogic了,但是更精彩的还在这后面。如果仅仅提供上面这些model的接口,你要如何跟controllers和views结合起来使用?当然使用Searchlogic提供的这些接口比使用Rails本身的接口方便多了,但是还不够方便。
Searchlogic另外提供了一个search方法,该方法接受一个hash,返回的是一个Searchlogic::Search对象。
可以这样用:
上面的代码相当于:
这个Searchlogic::Search对象有点类似named scope,它也不会立即发起SQL查询。也可以进行链式的调用以添加搜索条件,也可以读取搜索条件。
看起来似乎search方法更麻烦了些,但是这个hash……嗯,Controller中的params是个hash……想到了吧。
ok,现在从Controller开始,controller就这么干净:
页面是这样的(haml的代码,不明白可以当它是html.erb。什么是haml):
searchlogic改写了form_for方法,使它能够认识Searchlogic::Search对象,并在参数为Searchlogic::Search对象时,把form的method转为get。来看看源码:
另外SearchLogic还带了一个排序的order helper:
这会在面面上生成2个链接,效果如下图:
看看表头第一列那个Order Date,一看就知道是干什么用的了
利用现有的named scope
如果你已经定义了这样的一个named scope:
可以这样用:
然后你的表单是这样的:
注意这里传了个true给named scope,如果原来定义的named scope不接受任何参数,可以在这里传个true或者false给它,如果传的是个false,那么这个named scope将被忽略。如果named scope接受参数,那么这个值会被当作参数传给named scope。
分页:
和will_paginate结合使用,很简单:
__END__
cookie:
今天还发现一个好玩的小东西,叫faker,可以生成随机的姓名、email等等。蛮好玩的。
需要 i18n requires RubyGems version >= 1.3.6
参考:http://github.com/binarylogic/searchlogic
比较早就在用这个插件了,本来今天想响应蜗牛同学的号召,把这篇http://asciicasts.com/episodes/176-searchlogic给译一下,结果才译到第2句,发现译不下去。。还是乖乖写笔记吧。
Searchlogic是一个功能十分强大使用又很简单的Rails搜索插件。(BinaryLogic出品的两个插件真的很不错:Authlogic和Searchlogic)
安装:
script/plugin install git://github.com/binarylogic/searchlogic.git
扩展
装上之后,所有的model都被添加上了一系列的类方法(其实是通过method_missing实现的,见源码:http://github.com/binarylogic/searchlogic/blob/master/lib/searchlogic/named_scopes/conditions.rb)
这一系列的方法很容易看懂,直接copy官方的代码吧:
#假设我们有如下的model User(id: integer, created_at: datetime, username: string, age: integer) # Searchlogic会免费赠送给你这么一堆named scopes User.username_equals("bjohnson") User.username_equals(["bjohnson", "thunt"]) User.username_equals("a".."b") User.username_does_not_equal("bjohnson") User.username_begins_with("bjohnson") User.username_not_begin_with("bjohnson") User.username_like("bjohnson") User.username_not_like("bjohnson") User.username_ends_with("bjohnson") User.username_not_end_with("bjohnson") User.age_greater_than(20) User.age_greater_than_or_equal_to(20) User.age_less_than(20) User.age_less_than_or_equal_to(20) User.username_null User.username_not_null User.username_blank
这些方法的返回值都是一个named scope对象,因此你可以把它们串起来使用:
scope = User.username_like("bjohnson").age_greater_than(20).id_less_than(55) scope.all scope.first scope.count # 等等...等啥?在rails console里试试看看效果哇
完整的条件(conditions)列表见Searchlogic::NamedScopes::Conditions中的常量。
别名
作者说了,输入长长的“greater_than_or_equal_to”一点也不好玩,所以作者又为searchlogic添加了一系列别名:
User.username_is(10) # equals User.username_eq(10) # equals User.id_lt(10) # less than User.id_lte(10) # less than or equal to User.id_gt(10) # greater than User.id_gte(10) # greater than or equal to # 等等...
这些还不是searchlogic强大的地方。
searchlogic还可以搜索关联的对象(关联的数据库表),很简单:
# 假设我们有以下的关联 User.has_many :orders Order.has_many :line_items LineItem # 设置关联对象的字段的搜索条件 User.orders_total_greater_than(20) User.orders_line_items_price_greater_than(20) # 按照关联对象的某个字段排序 User.ascend_by_order_total User.descend_by_orders_line_items_price
wow 你一定已经惊呼了,不过还早。
自定义的named scope
因为这些方法的返回值都是named_scope,所以还可以这样用:
LineItem.named_scope :expensive, :conditions => "line_items.price > 500" User.orders_line_items_expensive
多态关联
更强大的来了:
searchlogic为多态关联也提供了很好的支持:
#假设有这样的关联: Audit.belongs_to :auditable, :polymorphic => true User.has_many :audits, :as => :auditable #可以这样搜索 Audit.auditable_user_type_username_equals("ben")
方法的格式有点特别,包含了这样的格式的前缀:
[多态关联的名字]_[关联的类型]_type
不过还是比较好懂的,只要给关联起个好名字,读起来还是很DSL的
强吧?还早还早
all 和any
User.username_like_any("bjohnson", "thunt") # 会发起一个查询,查找users表中username包含字符串bjohnson或者thunt的记录 User.username_like_all("bjohnson", "thunt") # 会发起一个查询,查找users表中username同时包含字符串bjohnson和thunt的记录 User.username_like_any(["bjohnson", "thunt"]) # 也可以接受一个数组形式的参数
or的使用
User.username_or_first_name_like("ben") => "username LIKE '%ben%' OR first_name like'%ben%'" User.id_or_age_lt_or_username_or_first_name_begins_with(10) => "id < 10 OR age < 10 OR username LIKE 'ben%' OR first_name like'ben%'"
注意,你并不需要每次都清楚的加上条件(例如gt、lt、begins_with等)。你只需要在结尾的部分指定。如果你在一个字段名后面加上另一个字段名,那么对这两个字段都将使用后面的条件。所以:
User.username_like_or_first_name_like("ben")
可以写成这样:
User.username_or_first_name_like("ben")
Make searching and ordering data in your application trivial
差不多已经可以使用Searchlogic了,但是更精彩的还在这后面。如果仅仅提供上面这些model的接口,你要如何跟controllers和views结合起来使用?当然使用Searchlogic提供的这些接口比使用Rails本身的接口方便多了,但是还不够方便。
Searchlogic另外提供了一个search方法,该方法接受一个hash,返回的是一个Searchlogic::Search对象。
可以这样用:
search = User.search(:username_like => "bjohnson", :age_less_than => 20) search.all
上面的代码相当于:
User.username_like("bjohnson").age_less_than(20).all
这个Searchlogic::Search对象有点类似named scope,它也不会立即发起SQL查询。也可以进行链式的调用以添加搜索条件,也可以读取搜索条件。
search.username_like # => "bjohnson" search.age_gt = 2 #=> 2 search.id_gt(10).email_begins_with("bjohnson") # => <#Searchlogic::Search...> search.all #=> An array of users search.count #=> integer # .. 等等
看起来似乎search方法更麻烦了些,但是这个hash……嗯,Controller中的params是个hash……想到了吧。
ok,现在从Controller开始,controller就这么干净:
class UsersController < ApplicationController def index @search = User.search(params[:search]) @users = @search.all end end
页面是这样的(haml的代码,不明白可以当它是html.erb。什么是haml):
- form_for @search do |f| = f.text_field :username_like = f.select :age_greater_than, (0..100) = f.text_field :orders_total_greater_than = f.submit
searchlogic改写了form_for方法,使它能够认识Searchlogic::Search对象,并在参数为Searchlogic::Search对象时,把form的method转为get。来看看源码:
# Automatically makes the form method :get if a Searchlogic::Search and sets # the params scope to :search def form_for(*args, &block) if search_obj = args.find { |arg| arg.is_a?(Searchlogic::Search) } options = args.extract_options! options[:html] ||= {} options[:html][:method] ||= :get options[:url] ||= url_for args.unshift(:search) if args.first == search_obj args << options end super end
另外SearchLogic还带了一个排序的order helper:
= order @search, :by => :age = order @search, :by => :created_at, :as => "Created date"
这会在面面上生成2个链接,效果如下图:
看看表头第一列那个Order Date,一看就知道是干什么用的了
利用现有的named scope
如果你已经定义了这样的一个named scope:
User.named_scope :four_year_olds, :conditions => {:age => 4}
可以这样用:
User.search(:four_year_olds => true, :username_like => "bjohnson")
然后你的表单是这样的:
- form_for @search do |f| = f.text_field :username_like = f.check_box :four_year_olds = f.submit
注意这里传了个true给named scope,如果原来定义的named scope不接受任何参数,可以在这里传个true或者false给它,如果传的是个false,那么这个named scope将被忽略。如果named scope接受参数,那么这个值会被当作参数传给named scope。
分页:
和will_paginate结合使用,很简单:
User.username_like("bjohnson").age_less_than(20).paginate(:page => params[:page]) User.search(:username_like => "bjohnson", :age_less_than => 20).paginate(:page => params[:page])
__END__
cookie:
今天还发现一个好玩的小东西,叫faker,可以生成随机的姓名、email等等。蛮好玩的。
gem install faker irb require 'rubygems' require 'faker' Faker::Name.name Faker::Name.name Faker::Name.name Faker::Internet.email Faker::Internet.email Faker::Internet.email
评论
6 楼
yuan
2010-11-04
Rails3版SearchLogic:https://github.com/ernie/meta_search
5 楼
yuan
2010-09-25
今天在搞Thinking Sphinx,仔细想了想:
这种用法其实不太干净。我也不知道算不算是把业务逻辑写到controller中了,至少是把具体的某个实现直接在controller中调用,使这个action依赖于searchlogic了。form_for方法也被改写了,从view到controller到model彻彻底底的入侵哇……怪不得第一次写searchlogic的测试的时候那么别扭。
searchlogic用着倒是很爽。
@search = Article.search(params[:search])
这种用法其实不太干净。我也不知道算不算是把业务逻辑写到controller中了,至少是把具体的某个实现直接在controller中调用,使这个action依赖于searchlogic了。form_for方法也被改写了,从view到controller到model彻彻底底的入侵哇……怪不得第一次写searchlogic的测试的时候那么别扭。
searchlogic用着倒是很爽。
4 楼
ZIFAN
2010-09-15
需要 i18n requires RubyGems version >= 1.3.6
3 楼
Hooopo
2010-06-19
faker好玩,不过都是英文名。。以前写账号池的时候是自己从豆瓣抓的那么多用户名。。。
2 楼
liucuan
2010-06-09
怎么在usename和age两个中搜索,而不是单一的搜索单个字段
1 楼
星情泪
2010-04-23
异常强大,不过我感觉最受用的还是后面那一部分,熟悉SQL之后再这样写
最后那个faker很好玩
User.username_like("bjohnson").age_greater_than(20).id_less_than(55)感觉有点怪怪的
最后那个faker很好玩
发表评论
-
rails测试中遇到的一些问题
2010-09-03 11:41 25161,页面的测试。 假设某view中有一个表单,表单里有3个字段 ... -
BDD on Rails
2010-05-11 02:59 0首先,嘿嘿,我对敏捷 ... -
authlogic-openid
2010-04-20 00:32 0http://github.com/binarylogic/a ... -
测试驱动开发实战(authlogic学习笔记)
2010-04-17 00:06 0这会是个很cool的笔记 cucumber还不会用,只用R ... -
RoR简单培训。
2010-04-12 10:08 0目的 上周二Bob给大家从总体上概括了一下Rails的开发。我 ... -
用RSpec和Webrat为页面写测试
2010-03-10 23:26 0The RSpec Book 23章(不完全照书上记,而是我自 ... -
rails杂记
2010-03-08 11:36 1429=======Rails2======= 用RSpec测试A ... -
Rails文件上传利器——paperclip笔记
2010-02-27 12:04 14931Githubhttp://wiki.github.com/th ... -
为SearchLogic添加一个remote_form_for方法。
2010-02-10 15:00 1382稍微看了一下,好像挺简单,只是处理了一下参数。 # A ... -
A Guide to Testing Rails Applications
2010-02-03 19:56 0什么是Fixtures fixtures允许你在测试运行之前往 ... -
改个bug
2010-01-20 17:38 1209问题见:http://yuan.iteye.c ... -
reset/reload
2010-01-20 16:26 1128http://caboo.se/doc/classes/Act ... -
Acts As Taggable On Steroids
2010-01-20 13:53 2599参考着mephisto写blog程序 ... -
Active Record Validations and Callbacks
2009-10-18 02:45 2364参考链接:http://guides.ru ... -
Layout in Rails
2009-10-12 17:28 4731参考链接:http://guides.rubyonrails. ... -
Rendering in Rails
2009-10-10 02:10 4516参考链接:http://guides.rubyonrails. ... -
如何为Rails的views写测试。
2009-10-01 16:53 1110原文链接:http://weblog.jamisbuck.or ... -
Rails Form helpers
2009-09-28 03:31 5164参考链接:http://guides.ru ... -
rails2.3 routes笔记
2009-09-23 04:10 2826参考链接:http://guides.ru ... -
rails中分模块开发。
2009-09-18 14:48 2302我没事就喜欢拿blog练手,blog简单嘛。 嗯,其实这是 ...
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...
- **生成器(Generators)**:Rails提供了强大的生成器工具,可以自动生成模型、控制器、迁移文件等,例如`rails generate model Post title:string content:text`。 - **数据库迁移(Database Migrations)**:...
**Rails 常用插件简介 - CRUD Generator 2** 在Ruby on Rails框架中,开发过程中经常需要创建、读取、更新和删除(CRUD)数据。为了提高开发效率,开发者通常会使用各种插件来自动化这个过程。CRUD Generator 2就是...
[适合] Rails :red_heart: Ansible [适合] Rails :red_heart: Ansible (有一点帮助) Rails部署 简单吧? 将应用程序放在服务器上。 捆绑宝石。 应用迁移。 重新启动服务。 Easy Rails部署 git push master ...
Rails 基本模板参考: : Ruby on Rails Gemfile:定义应用程序正在使用的库的文件bundle install:基于Gemfile,安装所有库每次修改 Gemfile 时都应该运行bundle install gem 是 Ruby 的库RubyGems.org 是一个查找和...
本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...
RailsConsole 工具包 :wrench: :toolbox: 可配置的 Rails 控制台助手更快地查找记录,添加自定义助手,将您的控制台寿命提高 100%。安装将此行添加到应用程序的 Gemfile 中: gem 'rails_console_toolkit' 然后生成...
- **添加插件**:可以通过插件扩展Rails项目的功能。 - **运行应用**:启动Rails应用进行测试。 - **使用Rails控制台**:通过内置的Rails控制台进行调试。 #### 六、编辑文件 - **实时代码辅助**:NetBeans提供了...
在Ruby on Rails框架中,`Rails ...尽管Rails 2.x已经很老,但这个插件依然在很多旧项目中发挥着作用,体现了其持久的实用性和适应性。通过理解并熟练运用will_paginate,你可以让你的Rails应用的分页功能更加完善。
6. **Rakefile和init.rb**: Rakefile用于定义任务,如安装或更新插件,而init.rb是Rails初始化脚本,负责加载插件。 7. **版本控制(.svn)**: 这个文件可能表示插件曾使用Subversion作为版本控制系统。现代项目更...
Rails电子邮件预览 使用此Rails引擎在浏览器中预览电子邮件。 与Rails 4.2+兼容。 一封电子邮件评论: 所有电子邮件预览的列表: REP带有两个主题:一个简单的独立主题和一个使用的主题。安装加 到Gemfile: gem '...
Rails :: Dom :: Testing 这个gem负责比较HTML DOM并断言Rails应用程序中存在DOM元素。 assert_dom_equal通过assert_dom_equal和assert_dom_not_equal进行比较。 元素通过assert_dom , assert_dom_encoded , ...
webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...
ruby on rails for eclipse开发插件
描述中的“NULL”表明没有给出具体的插件列表或详细描述,但通常Rails插件可能包括但不限于数据库管理工具、认证与授权机制、表单处理、搜索引擎优化、日志分析、测试工具、性能监控等类别。通过博文链接...
### Flexible Rails: Flex3 on Rails2 #### 关于Flexible Rails 本书《Flexible Rails: Flex 3 on Rails 2》由Peter Armstrong撰写,旨在探讨如何结合使用Flex 3和Rails 2来开发高效的富互联网应用程序(Rich ...
rails_stack 食谱 TODO:在此处输入食谱说明。 例如,这本食谱使您最喜欢的早餐三明治。 要求 TODO:列出您的食谱要求。 确保包含本说明书对平台、库、其他说明书、软件包、操作系统等的任何要求。 例如 包裹 ...
Rails::Cache::Extended 这允许为记录集合生成自动过期的缓存键 安装 将此行添加到应用程序的 Gemfile 中: gem 'rails-cache-extended' 然后执行: $ bundle 或者自己安装: $ gem install rails-cache-...
Rails :: Controller :: Testing 这个gem将assigns给控制器测试的内容以及assert_template带回assigns控制器和集成测试的内容。 这些方法已中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-...