围绕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进行数据库查询。

增加对SequelMongoidMongoMapper的支持(或多或少)是该宝石的计划功能。

如果您有兴趣为速度开发做出贡献,请打开一个问题并与我们联系。

快速启动(分5步)

以下示例假设我们为User模型的用户的索引页面设置ajax-datatables-rails

我们使用Postgresql作为数据库,因为你应该使用它。(它也可以与其他数据库一起使用,见上文)

目标是为每个用户呈现一个用户表和显示:idfirst namelast nameemailbio

类似这样的内容:

<表格>

ID

名字

姓氏

电子邮件

简介

1个

约翰

Doe公司

john.doe@example.net

到处都是你的默认用户吗

2个

Doe公司

jane.doe@example.net

是约翰的妻子吗

3个

詹姆斯

Doe公司

james.doe@example.net

是约翰的兄弟和最好的朋友

以下是我们正在经历的步骤:

1) 生成数据表类

运行以下命令:

这将在app/datatables中生成一个名为user_datatable.rb的文件。

打开文件并按照注释的指示在函数中进行自定义。

请看这里,了解有关生成器语法的解释。

2) 构建视图

您应该始终从真理的单一来源开始,即您的html视图。

3) 自定义生成的Datatables类

a.声明列映射

首先,我们需要在view_columns中声明映射到我们需要呈现的数据的模型列的列表。

在这种情况下:idfirst_name、<12.18>、<1.211>和bio

这给了我们:

注:默认orderablesearchable为真,cond:like

cond可以是:

nulls_last参数允许null最后排序。您可以像上面那样按列配置它,也可以按数据表类配置它:

请参阅此处以获取有关列定义以及如何使用关联模型的更多详细信息。

您可以使用带lambda的:formatter选项自定义或清除传递给DB的搜索值:

传递给lambda的对象是搜索值。

b.地图数据

然后我们需要将get_raw_records方法检索到的记录映射到我们想要显示的真实值:

不推荐:您可以对列使用v0.3阵列样式:

此方法构建一个2d数组,数据表使用该数组来构造html

桌子在每列上插入所需的值。

这种方法的缺点是不能通过DT_RowId,所以在数据表中相应的<tr>上设置id属性很难(需要在JS端完成)。

如果您需要使用link_tomail_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_tomail_to

data方法返回的JSON表示中,edit_user_pathcheck_box_tag等。

要使用这些方法,可以这样做:

使用视图装饰器

如果您想在数据映射方法中保持整洁,可以使用

Draper定义列映射,如下所示。

注意:这是推荐的方式,因为您不需要在Datatable对象中注入view_context来访问helper方法。

它还有助于将视图/表示逻辑与过滤逻辑(数据表类中唯一真正重要的逻辑)分离。

例子:

将选项传递给数据表类

AjaxDatatablesRails::ActiveRecord继承的类可以在初始化时接受选项哈希。这在需要时为灵活性提供了空间。

例子:

更改数据表类的DB适配器

如果您有来自不同数据库的模型,您可以在数据表类上设置db_adapter

列语法

您可以在同一个数据表中混合使用多个模型。

假设我们有以下模型:UserPurchaseOrder

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)

专业提示™

创建主父类(简单)

本着RailsApplicationControllerApplicationRecord的相同精神,您可以创建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

贡献

带有Rails的DataTable无法提交多个页面项目

如何在 ruby​​ on rails 中显示 Datatable 表格工具(复制、csv、excel、pdf、保存)

使用Rails中的DataTable对格式化的日期列进行排序

ruby 具有选择过滤器等的Ajax DataTable Rails(Client DashBoard示例)

Rails 加密的列仍然允许搜索

rails中的管理功能:错误:找不到具有'id'=的用户