围绕DataTable';允许在Rails应用程序中与服务器端分页同步的ajax方法
Posted
tags:
中文标题:围绕DataTable';允许在Rails应用程序中与服务器端分页同步的ajax方法 原文标题:A wrapper around DataTable's ajax methods that allow synchronization with server-side pagination in a Rails app 项目评级:Star:568 Fork:221 下载地址:https://github.com/jbox-web/ajax-datatables-rails 详情介绍ajax数据表轨道
重要提示:此gem针对的是DataTables 1.10.x版本。
它针对以下方面进行了测试:
描述
DataTables是一个漂亮的jQuery插件,它增加了对html表进行分页、排序和搜索的功能。
然而,在处理大表(超过几百行)时,我们会遇到性能问题。
这些问题可以通过使用服务器端分页来解决,但这会破坏一些DataTables的功能。
ajax-datatables-rails
是一个围绕DataTables ajax方法的包装器,该方法允许与Rails应用程序中的服务器端分页同步。
它的灵感来自这位Railscast。
我需要在我正在进行的几个项目中实现类似的解决方案,所以我将一个解决方案提取到了一个gem中。
Joel Quenneville(原作者)
我需要一个好的gem来管理很多DataTables,所以我选择了这个:)
Nicolas Rodriguez(现任维护人员)
这个gem的最终目标是生成一个JSON内容,该内容将提供给jQueryDataTables。
所有数据表自定义(header、tr、td、css类、width、height、buttons等)都必须在数据表的javascript定义中进行。
jQueryDataTables是一个非常强大的工具,提供了许多自定义功能。花点时间阅读文档。
您可以在此处找到一个示例项目:https://ajax-datatables-rails.herokuapp.com
它在现实世界中的例子。代码在这里:https://github.com/jbox-web/ajax-datatables-rails-sample-project
安装
将这些行添加到应用程序的Gemfile中:
然后执行:
我们在这里假设您已经安装了jQuery DataTables。
您可以安装jQuery DataTables:
笔记
目前AjaxDatatablesRails
只支持ActiveRecord
作为ORM进行数据库查询。
增加对Sequel
、Mongoid
和MongoMapper
的支持(或多或少)是该宝石的计划功能。
如果您有兴趣为速度开发做出贡献,请打开一个问题并与我们联系。
快速启动(分5步)
以下示例假设我们为User
模型的用户的索引页面设置ajax-datatables-rails
,
我们使用Postgresql作为数据库,因为你应该使用它。(它也可以与其他数据库一起使用,见上文)
目标是为每个用户呈现一个用户表和显示:id
、first name
、last name
、email
和bio
。
类似这样的内容:
<表格>
ID 名字 姓氏 电子邮件 简介
表格>
以下是我们正在经历的步骤:
1) 生成数据表类
运行以下命令:
这将在app/datatables
中生成一个名为user_datatable.rb
的文件。
打开文件并按照注释的指示在函数中进行自定义。
请看这里,了解有关生成器语法的解释。
2) 构建视图
您应该始终从真理的单一来源开始,即您的html视图。
3) 自定义生成的Datatables类
a.声明列映射
首先,我们需要在view_columns
中声明映射到我们需要呈现的数据的模型列的列表。
在这种情况下:id
、first_name
、<12.18>、<1.211>和bio
。
这给了我们:
注:默认orderable
和searchable
为真,cond
为:like
。
cond
可以是:
nulls_last
参数允许null最后排序。您可以像上面那样按列配置它,也可以按数据表类配置它:
请参阅此处以获取有关列定义以及如何使用关联模型的更多详细信息。
您可以使用带lambda的:formatter
选项自定义或清除传递给DB的搜索值:
传递给lambda的对象是搜索值。
b.地图数据
然后我们需要将get_raw_records
方法检索到的记录映射到我们想要显示的真实值:
不推荐:您可以对列使用v0.3阵列样式:
此方法构建一个2d数组,数据表使用该数组来构造html
桌子在每列上插入所需的值。
这种方法的缺点是不能通过DT_RowId
,所以在数据表中相应的<tr>
上设置id属性很难(需要在JS端完成)。
如果您需要使用link_to
、mail_to
等视图辅助对象,请参阅此处。。。
c.获取原始记录
Th公司
是您的查询所在的位置。
显然,您可以根据使用数据表的用例的需要构建查询。
例子:
您可以根据在Datatable
对象中注入的任何参数,将任何逻辑放入get_raw_records
中。
重要提示:由于此方法的结果将链接到ActiveRecord
的方法进行排序、过滤和分页,
确保返回一个ActiveRecord::Relation
的对象。
d.附加数据
您可以通过定义#additional_data
方法在渲染的JSON中注入其他键/值对:
对于datatables factory(或yadcf)提供下拉筛选器的值非常有用。
4) 设置控制器操作
将控制器设置为响应JSON
不要忘记确保已将正确的路线添加到config/routes.rb
。
如果您需要在UserDatatable
中注入params,请参见此处。
注意:如果您的应用程序中有2个以上的数据表,请不要忘记阅读。
5) 连接Javascript
最后,使用javascript将这一切联系在一起。在适当的coffee
文件中:
或者,如果您使用的是纯javascript:
高级使用
使用视图辅助对象
有时您需要使用视图辅助方法,如link_to
、mail_to
,
data
方法返回的JSON表示中,edit_user_path
、check_box_tag
等。
要使用这些方法,可以这样做:
使用视图装饰器
如果您想在数据映射方法中保持整洁,可以使用
Draper定义列映射,如下所示。
注意:这是推荐的方式,因为您不需要在Datatable对象中注入view_context
来访问helper方法。
它还有助于将视图/表示逻辑与过滤逻辑(数据表类中唯一真正重要的逻辑)分离。
例子:
将选项传递给数据表类
AjaxDatatablesRails::ActiveRecord
继承的类可以在初始化时接受选项哈希。这在需要时为灵活性提供了空间。
例子:
更改数据表类的DB适配器
如果您有来自不同数据库的模型,您可以在数据表类上设置db_adapter
:
列语法
您可以在同一个数据表中混合使用多个模型。
假设我们有以下模型:User
,PurchaseOrder
,
Purchase::LineItem
并且我们需要从这些模型中获得几个列
可在我们的数据表中进行搜索和排序。
关联模型和嵌套模型
前面的示例只有一个模型。但如果你有
一些关联的嵌套模型,以及在报表中要显示的字段
这些表格。
以一个Event, Course, CourseType, Allocation, Teacher, Contact, Competency and CompetencyType
型号为例。我们想要一个数据表
具有以下列的报告:
我们希望对列表的所有列进行排序和搜索。
相关定义为:
对上述代码的一些评论:
重要:
确保将.references(:related_model)
与任何
关联模型。这迫使所有相关模型都急于加载
通过一个SQL查询,并且任何列的搜索条件都可以正常工作。
否则:recordsFiltered => filter_records(get_raw_records).count(:all)
将生成2个SQL查询(一个用于Event模型,另一个用于
相关联的表)。:recordsFiltered => filter_records(get_raw_records).count(:all)
将只使用从ActiveRecord::Relation对象返回的第一个
在get_raw_records
中,您将得到未知列的错误消息
“where子句”中的“yourtable.yourfield”,如果搜索字段值为
不是空的。
因此,使用.includes()
方法的查询为:
默认范围
请参阅DefaultScope是邪恶的,以及#223和#233。
日期范围搜索
此功能适用于数据表工厂(或yadcf)。
要启用日期范围搜索,例如created_at
:
生成器语法
此外,从AjaxDatatablesRails::ActiveRecord
继承的类不绑定到
Rails应用程序中现有的模型、模块、常量或任何类型的类。
您可以向数据表类传递一个名称,如下所示:
最终,由开发人员决定哪种模型、范围、关系
(或else)在datatable类内部使用以从
数据库
测验
如果您在集成测试期间不使用Webrick,则可以使用Capybara对数据表进行测试。
长话短说,经验法则是:在任何地方都使用相同的Web服务器(开发、生产、暂存、测试等)。
如果您使用Puma(Rails默认的Web服务器),那么在任何地方都可以使用Puma,即使在CI/test环境中也是如此。Thin也是如此。
您将避免常见的情况:它在开发环境中有效,但在测试环境中无效。。。
如果你想用很多测试数据表
你可能需要这种技巧:https://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara.(感谢CharlieIGG)
专业提示™
创建主父类(简单)
本着RailsApplicationController
和ApplicationRecord
的相同精神,您可以创建ApplicationDatatable
类(在app/datatables/application_datatable.rb
中)
将从其他类继承:
这样就更容易对数据表进行DRY。
加速JSON渲染(简单)
安装yajl-ruby,基本上:
然后
仅此而已:)(如果可用,自动首选Yajl或JSON后端,而不是Yaml)
使用HTTPPOST
方法(中等)
使用HTTPPOST
的方法避免414 Request-URI Too Large
的错误。参见:#278和#308。
您可以在config/routes.rb
中轻松定义路线关注点,并在需要时重复使用:
然后在控制器中:
那么在您看来:
然后在你的咖啡/JS:
为Postgresql(Expert)创建索引
为了加快使用默认配置时执行的ILIKE
查询的速度,您可能需要考虑添加一些索引。
对于postgresql,建议您使用gin/gist索引类型。
这使得有必要启用postgrsql扩展pg_trgm
。在尝试启用此扩展之前,请仔细检查是否已安装此扩展。
用于启用扩展和创建索引的迁移可能如下所示:
辅导的
按JSONB列值筛选:#277
使用ajax-datatables-rails
的has_scope宝石:#280
使用数据表正交数据:参见#269
贡献
如何在 ruby on rails 中显示 Datatable 表格工具(复制、csv、excel、pdf、保存)
使用Rails中的DataTable对格式化的日期列进行排序