`

强大的 Rails 2 查询、搜索插件:SearchLogic

阅读更多
发现还有人在看这个博客,这个 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出品的两个插件真的很不错:AuthlogicSearchlogic

安装:
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
  • 大小: 36.4 KB
分享到:
评论
6 楼 yuan 2010-11-04  
5 楼 yuan 2010-09-25  
今天在搞Thinking Sphinx,仔细想了想:
@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之后再这样写
User.username_like("bjohnson").age_greater_than(20).id_less_than(55)
感觉有点怪怪的

最后那个faker很好玩

相关推荐

    ### 文章标题: 【自然语言处理】基于ChatGPT的REFORMER框架:提升Text-to-SQL模型的数据合成与增强系统设计

    内容概要:本文介绍了REFORMER,一个由ChatGPT驱动的数据合成框架,旨在解决Text-to-SQL模型因训练数据不足而导致的泛化能力差的问题。REFORMER通过“检索-编辑”方法,利用ChatGPT生成新的(问题,SQL查询)对,无需额外训练。该框架还引入了问题-查询-问题循环一致性验证,确保生成数据的质量。此外,REFORMER探索了两种数据增强技术:带模式信息的直接改写和使用构造SQL查询描述的改写。实验结果表明,REFORMER在多个评估指标上均优于之前的增强方法。 适合人群:对自然语言处理和SQL查询生成感兴趣的科研人员、工程师,尤其是从事Text-to-SQL模型开发和优化的专业人士。 使用场景及目标:①生成更多样化和高质量的(问题,SQL查询)对以增强Text-to-SQL模型的训练数据;②通过ChatGPT生成新的SQL查询和问题改写,提升模型的泛化能力和适应新领域的能力;③验证生成数据的一致性和质量,确保其符合预期。 阅读建议:本文不仅展示了REFORMER的技术细节和实验结果,还讨论了其局限性和未来研究方向。读者应重点关注框架的设计思路、实验设置和结果分析,以理解ChatGPT在数据增强中的应用潜力。同时,建议结合实际应用场景,思考如何利用REFORMER提升现有Text-to-SQL系统的性能。

    20220319-1.pdf

    20220319-1.pdf

    电磁兼容仿真:电磁敏感性分析.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

    ### 软考高项项目管理领域核心知识点与备考策略:涵盖综合知识、案例分析与论文写作

    内容概要:本文详细介绍了软考高项(高级信息系统项目管理师)的备考策略、考试内容及应试技巧。首先,文章强调了二八法则的应用,即80%的时间精力应放在项目管理领域的核心知识点上,如五大过程组、十大知识域等,20%的时间放在IT知识和组织级项目管理上。备考分为三个阶段:基础阶段通过精读教材、绘制思维导图夯实基础;强化阶段通过真题训练、案例分析提升实战能力;冲刺阶段通过论文押题、模拟考试做好最后准备。文章还特别指出,计算题和论文写作是考试的重点和难点,需重点练习。此外,针对不同地区的考生,提供了差异化的备考建议,如一线城市侧重新技术应用,中西部地区关注乡村振兴信息化等。最后,文章提醒考生关注机考模拟系统的开放时间和准考证打印时间,确保顺利参加考试。 适合人群:准备参加软考高项考试的考生,特别是有一定项目管理基础并希望系统复习、提高应试能力的考生。 使用场景及目标:①帮助考生高效利用有限时间,集中精力复习核心知识点;②通过模拟练习和真题训练,提升计算题和论文写作的能力;③结合实际案例,掌握项目管理全流程知识,提高考试通过率。 其他说明:备考过程中,考生应结合自身实际情况,灵活调整学习计划。同时,充分利用各种学习资源,如精讲课视频、直播课、历年真题等,不断巩固和深化对知识点的理解。考试改革后,机考成为主流,考生需提前熟悉机考系统,确保考试时能够熟练操作。

    多功能医用护理床(sw20可编辑+cad+说明书)_三维3D设计图纸.zip

    多功能医用护理床(sw20可编辑+cad+说明书)_三维3D设计图纸.zip

    西门子S7-200 Smart与台达DT330温控器基于Modbus RTU的485通讯实现及调试技巧

    内容概要:本文详细介绍了西门子S7-200 Smart PLC与台达DT330温控器通过RS485接口进行Modbus RTU通讯的方法。首先,文中阐述了双方设备的通讯参数设置,确保波特率、校验位等参数的一致性。接着,展示了PLC端的轮询控制逻辑,采用定时器和状态机来管理读写操作,避免数据冲突。对于具体的读写操作,提供了详细的寄存器地址映射规则以及数据类型的转换方法,解决了台达温控器特有的寄存器地址偏移问题。此外,还分享了一些实用的调试技巧,如使用串口助手抓包验证通讯效果,以及针对常见错误码的解决方案。最后,在触摸屏方面,利用昆仑通态MCGS组态软件实现了温度数据显示和设定的功能。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些需要进行PLC与温控器通讯集成工作的人员。 使用场景及目标:适用于需要将西门子S7-200 Smart PLC与台达DT330温控器进行通讯连接并实现温度监控的应用场合。主要目的是掌握正确的通讯配置步骤,理解Modbus RTU协议的具体应用,提高系统的可靠性和稳定性。 其他说明:文中提到的所有代码均已经过实际测试,并附带详细的注释,便于读者理解和学习。同时强调了硬件连接的重要性,给出了接线建议,帮助初学者少走弯路。

    基于Simulink的四永磁同步电机偏差耦合同步控制仿真建模与优化

    内容概要:本文详细介绍了利用Simulink构建四台永磁同步电机(PMSM)偏差耦合同步控制系统的方法及其优化策略。首先阐述了多电机同步控制在工业自动化中的重要性和应用场景,如AGV小车底盘驱动、传送带协同等。接着深入探讨了偏差耦合控制的具体实现方式,包括环形耦合结构的设计、耦合补偿算法以及PID参数调整方法。文中特别强调了耦合系数的选择对于系统稳定性的影响,并提供了具体的MATLAB函数用于计算各电机之间的耦合补偿量。此外,还讨论了如何通过动态权重分配算法来增强相邻电机间的耦合关系,从而提高同步速度。同时,针对可能出现的问题提出了预防措施,如避免使用微分环节、设置合理的摩擦系数和采样周期等。最后分享了一些实践经验,例如采用在线参数辨识技术和低通滤波器以应对负载突变等情况。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是那些对多电机同步控制感兴趣的读者。 使用场景及目标:适用于需要精确控制多个电机同步运行的场合,如生产线上多轴协调动作、机器人关节控制等。主要目的是确保各个电机能够按照预定的速度平稳地协同工作,减少由于不同步造成的故障风险。 其他说明:文章不仅提供了理论指导,还包括了许多实用的操作技巧和注意事项,有助于读者更好地理解和掌握这一复杂的控制技术。

    2011春土木工程施工习题集(1).pdf

    2011春土木工程施工习题集(1).pdf

    信捷XD5 PLC与欧姆龙E5CC温控器基于Modbus RTU的双设定温度控制系统实现

    内容概要:本文详细介绍了信捷XD5 PLC与欧姆龙E5CC温控器之间的通讯实现及其双设定温度控制功能。首先,文中阐述了硬件连接的具体步骤,包括PLC、温控器和触摸屏的选择与连接方式。接着,详细解释了参数设置的关键点,确保两者能够正确通信。然后,展示了主程序的轮询机制以及温度读取、设定值写入和输出控制的具体代码实现。针对可能出现的问题,提供了详细的避坑指南和技术细节,如温度值转换、通讯超时处理等。最后,强调了系统的稳定性和可靠性,并给出了实际应用中的经验和建议。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC与温控器通讯感兴趣的读者。 使用场景及目标:适用于需要实现PLC与温控器之间高效、稳定的通讯控制的工业自动化项目。目标是帮助工程师快速掌握信捷XD5 PLC与欧姆龙E5CC温控器的通讯配置和双设定温度控制的实现方法。 其他说明:文中提供的代码和配置建议已经过实际项目的验证,具有较高的实用价值。对于初学者来说,可以作为入门级的学习资料;对于有一定经验的技术人员,则可以作为参考和优化现有系统的依据。

    (整理)2 全 四川大学 土木工程经济练习题 四川大学锦城学院 肖栋天 0303COLLEGE TWO XIA.doc

    (整理)2 全 四川大学 土木工程经济练习题 四川大学锦城学院 肖栋天 0303COLLEGE TWO XIA.doc

    电大自我鉴定土木工程.doc

    电大自我鉴定土木工程.doc

    粉料搅拌器sw18_三维3D设计图纸.zip

    粉料搅拌器sw18_三维3D设计图纸.zip

    00300118347_ad5d7425.pdf

    00300118347_ad5d7425.pdf

    【嵌入式开发】STM32F103C8T6最小系统板硬件组成与开发环境搭建指南:快速上手嵌入式项目开发

    内容概要:文章详细介绍了 STM32F103C8T6 最小系统板,包括其组成、硬件连接方式、开发环境搭建步骤以及一个简单的 LED 闪烁示例代码。STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的 32 位微控制器,具有高性能、低功耗和丰富的外设资源。最小系统板由主处理器、电源电路、时钟电路、复位与调试接口和 I/O 引脚组成。硬件连接方面,支持多种供电方式和调试接口。开发环境可以使用 STM32CubeIDE、Keil MDK-ARM 或 Arduino IDE 搭建。; 适合人群:对嵌入式开发有兴趣的学习者和初学者,尤其是希望了解 STM32 系列微控制器的开发者。; 使用场景及目标:① 学习 STM32F103C8T6 最小系统板的基本组成和硬件连接;② 搭建适合 STM32F103C8T6 的开发环境,如 STM32CubeIDE 或 Keil MDK-ARM;③ 实现简单的嵌入式项目,如 LED 闪烁示例。; 其他说明:此指南提供了详细的步骤和示例代码,帮助用户快速上手 STM32F103C8T6 最小系统板的开发。建议在实际操作中仔细阅读每一步骤,并参考提供的代码示例进行实践。

    公共安全视频图像信息系统管理条例.docx

    公共安全视频图像信息系统管理条例.docx

    回转工作台sw20_三维3D设计图纸_三维3D设计图纸.zip

    回转工作台sw20_三维3D设计图纸_三维3D设计图纸.zip

    清晰结构的三螺杆泵sw16可编辑_三维3D设计图纸_三维3D设计图纸.zip

    清晰结构的三螺杆泵sw16可编辑_三维3D设计图纸_三维3D设计图纸.zip

    汽轮机低压缸sw22可编辑_三维3D设计图纸_三维3D设计图纸.zip

    汽轮机低压缸sw22可编辑_三维3D设计图纸_三维3D设计图纸.zip

    电磁场仿真:磁热耦合仿真.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

    蓝桥杯相关资源,入门训练

    蓝桥杯

Global site tag (gtag.js) - Google Analytics