zoukankan      html  css  js  c++  java
  • gem "ransack"(4000✨) 简单介绍

    Object-based searching:演示。

    git:  https://github.com/activerecord-hackery/ransack

    Gorails视频和我的博客记录:https://www.cnblogs.com/chentianwei/p/9822492.html

    对比类似的搜索gem 'searchkich'

    全栈课上有这个gem的介绍:https://www.cnblogs.com/chentianwei/p/9438461.html 


    ransack 会用数据库的 LIKE 语法来做搜寻,虽然用起来方便,但它会逐笔检查资料是否符合,而不会使用数据库的索引。如果数据量非常多有上万笔以上,搜寻效能就会不满足我们的需要。这时候会改安装专门的全文搜寻引擎,例如 Elasticsearch,这是大数据等级的。

    之前的博客(全栈)https://www.cnblogs.com/chentianwei/p/9438461.html


     Gem "Ransack"

    Ransack enables the creation of both simple and advanced search forms for your Ruby on Rails application。

    Ransack不是在model层和controller层的简化搜索.

    Ransack用于创建搜索表格form.

    A form is a paper with questions on it and spaces marked where you should write the answers.
    
    A table is a written set of facts and figures arranged in columns and rows.

    Controller

    def index
      @q = Person.ransack(params[:q])
      @people = @q.result(distinct: true)
    end
    
    #如果在一个关联的table的column上进行sorting. 不使用distinct: true
    
    #下面的例子将预加载preloadingPerson's Articles表格,并使用pagination gem插件。所以去掉distinct: true选项
    
    def index
      @q = Person.ransack(params[:q])
      @people = @q.result.includes(:articles).page(params[:page])
    
      #可以附加to_a.uniq,把relation对象转化为Array,使用uniq方法去掉重复记录。
    end

    View

    定义了2个helper

    • search_form_for: 取代form_for用于创建view的 search form
    • sort_link:给table headers添加上可sortable links。

     

    具体用法:

    看演示  http://ransack-demo.herokuapp.com

    并参考源码

    search_form_for

    <%= search_form_for @q do |f| %>
        # name是User的column
        <%= f.label :name_cont %>
        <%= f.search_field :name_cont%>
    
        # 如果搜索关联表格Article的column: 用articles_title_start
        <%= f.label :articles_title_start %>
        <%= f.search_field :articles_title_start %>
    
        #属性可以链接到一起进行查询,例如User有2个相关columns:  first_name和last_name
        <%= f.label :first_name_or_last_name_cont %>
        <%= f.text_field :first_name_or_last_name_cont%>
    <% end %>

    解释:

    f.search_field的参数的格式:

    attribute_name[_or_attribute_name]..._predicate

    #如first_name_or_last_name_cont

     

    search predicate:搜索谓语

    在Ransack搜索中, Predicates用于决定匹配什么信息。

    查看:Ransack定义的全部predicate

    详细的小例子:https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching

    例子:

    cont(contains) :用于检查一个属性中是否包括一个值。

    使用Like "%xxx%"语法。

    >> User.ransack(first_name_cont: 'Rya').result.to_sql
    => SELECT "users".* FROM "users"  WHERE ("users"."first_name" LIKE '%Rya%')

    start(start_with)

    LIKE "%xx"  开头是xxx, 类似正则表达式/^xxx/

    >> User.ransack(first_name_start: 'Rya').result.to_sql
    => SELECT "users".* FROM "users"  WHERE ("users"."first_name" LIKE 'Rya%')

  • 相关阅读:
    部分源码:Visual Studio 2019 C运行时库(CRT)部分源码
    反思:中国歌手和欧美歌手的比较
    lol:lol 10分钟前上路到线小兵107只
    OS:RPM包的通用命名规则(转载)
    OS: kali linux的安装和配置
    OS_linux:Systemd 文档
    visual studio 2019 插件安装(插件扩展名vsix)
    解决git合并冲突问题
    nodejs封装的MongoDB的增删改查方法
    vue项目中购物车的全选功能的实现
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9999326.html
Copyright © 2011-2022 走看看