ruby on rails
Ruby on Rails具有许多内置的方法,这是其本质。 在某种程度上,由于其众所周知的缓慢性能,它可能会产生某种污名,但是其中一些方法已经可以帮助您编写干净,更快的代码。
所谓的查询接口是Active Record提供的几种查找器方法之间的混合结果,它们可以访问数据库并以您要求的方式检索所需数据。
这意味着通过Active Record交互式界面,您可以使用Ruby(而不是应用程序的查询语言)构造,修改或检索数据,从而接收与查询相对应的模型的新实例化Ruby对象。
组成查询接口的方法将返回ActiveRecord :: Relation的实例 声明在ActiveRecord模块 (Rails中查询语法的核心)上,并且可以让您操纵数据的数量,特异性和显示方式。
查询方法仅读取和/或排序数据,属于以下描述性类别:
- 检索单个对象。
- 检索多个对象。
- 使用条件。
- 返回特定数量的对象。
- 返回对象的特定分类。
- 订单数据。
要查看方法的完整列表,请单击 此处 。 在本文中,我将重点介绍更常见和有用的查找器方法。
让我们分析一些方法。
单对象方法。
关于单个对象查询方法最可识别的功能之一是它们检索数据库表的一行,换句话说就是单个对象。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-v88z28sb.png?alt=media&token=d475c752-524e-4a8a-9ac1-9afca8487f3f)
find方法接受一个参数,即要查找的对象的ID号,并仅返回该对象。 在示例图像中,我们可以看到数字是如何传递的(可以传递任何整数),但是可以使用第一种方法轻松地将这行代码替换为下一个:
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-d79l28k6.png?alt=media&token=ff2eb284-724d-4c7d-af7b-bfda42fe9a2a)
这些方法的bot是一个单一对象方法,并且彼此等效。 以类似的方式,我们将第二个 和最后的方法。
多对象方法。
多对象方法具有检索封装在数据库列内的所有数据的特征。 由于此方法管理着大量信息,因此数据模型中一些最有趣的代码属于此类别。 让我们看看其中的一些了解原因。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-yn1c28gz.png?alt=media&token=0ee9ac4a-dd06-4551-9027-501d53a88e65)
pluck方法是一种快捷方式,可以直接在数据库中获取一个或多个特定表的列,以检索对象列表。
在上面的示例中,直接指向Article表中的author列,而无需访问表中所有不必要的信息,因此与其他类型的多对象查询方法(如all)相比,响应速度更快 方法。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-b13n28j5.png?alt=media&token=3b91e209-b8cd-4d31-9f01-e079e26118a2)
身份证 finder方法使您只想检索ID列表时就可以编写更少的代码,甚至不必使用pluck方法。
查询条件。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-ic4n28zh.png?alt=media&token=9b7f8f97-63bc-47bf-a765-cf504be818cb)
查询where方法按照括号内的指令(条件)过滤信息,并获取条件所要求的正确数据量。
image方法中where方法的示例语法向我们展示了一个作为参数传递的数组,但是也可以传递其他几个类对象,需要注意的重要一点是and字,它将条件建立为逻辑之一。 实际上,我们在第一张图片中传递的参数与下面的图片完全相同,这是严格存在两个属性的选择,名字是John AND Doe。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-x7b028v6.png?alt=media&token=d71ce086-4732-4227-a001-ee64ba23c601)
条件背后的概念是我们许多人熟悉的逻辑表达式,但必须注意,根据传递为条件容器的参数的类型,我们将以不同的方式编写条件。 单击此处了解更多信息。
具体数量的对象。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-lsdg28jn.png?alt=media&token=63f13398-2ef0-4e35-ae59-b996342d020f)
属于该类别的方法很简单,您可以使用limit方法指定要提取的记录数,并使用offset query方法指定要开始返回记录之前要跳过的记录数。
上图中的代码将从第十个位置开始返回十篇文章。 如果未声明偏移量,则检索到的数据将仅包括从存储第一个位置开始的限制的指定对象。
对象的特定分类。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-njdn28v4.png?alt=media&token=9bbd390c-6e0d-47e7-b0d7-c320b5b948dd)
有趣的事情始于这种方法, 范围查询 通过链接您的自定义版本并允许您自由地应用数据库体系结构,可以实现其他查询方法的几种组合。
范围在安全性上与普通类方法不同,第一个将始终返回一个关系,而我们的简单类方法实现不会并且也不会破坏链式能力,此外,如果您具有关系,则可以访问其数据,直接从视图或控制器,而无需编写更多代码。
如图中所示,要声明一个作用域,您:首先,命名您的作用域,然后,编写要传递的参数/属性和对传递的数据进行操作的块。
要调用一个或多个作用域,请将它们链接到数据表对象并传递所需的参数。 你看? 声明和调用作用域的逻辑实际上类似于您声明类方法所遵循的逻辑。 有关更多的实现,请转到下一部分。
订购数据。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-0d1y294p.png?alt=media&token=f08d2679-4a39-4774-99ab-47ae4b802208)
显然, 订购方法可以帮助我们订购数据。 这是我们拥有的最有趣的查询方法之一,因为可以使用两种不同的实现方式,并且在编写代码时可能具有重要性。
在第一张图片中,我们看到一个简单的排序代码,其中order方法接受一个参数,该参数可以是属性,字符串和列名。 如果未指定顺序方向,则默认情况下将应用升序。 要指定此订购方向,您可以查看以下语法:
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-bu4929ll.png?alt=media&token=7b6604b7-a97a-4071-a8db-7acae3d232ed)
订购方法的重要性与其他查询方法一起存在于其应用程序中,例如,当您要在屏幕上显示多个对象时,最佳做法是执行订购操作,因为数据模型而不是在控制器或控制器中。在视图中。 让我们通过两个图片如下:在第一个,我们可以看到的声明default_scope ,(这意味着在默认状态下,你定制,为您的数据模型,并会出现在它的数据所做的每一个动作),在这里我们是说默认情况下,模型中的所有对象将按下降顺序排序,因此,每次从视图中调用数据时(如第二幅图像中一样),数据将以下降顺序显示,没有任何新行代码。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-8k1s29ku.png?alt=media&token=c623ffc5-4ed9-4bbb-bebd-aec30668e3a6)
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-mwa229pb.png?alt=media&token=ccf67701-71ea-4824-8d87-7309e79dea67)
另一种选择是声明一个命名范围 ,然后从视图中对其进行调用,如下图所示。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-7m9q29sh.png?alt=media&token=1fd374ba-cf7c-4e9c-a4f6-cea566f4efe3)
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-znbm29cg.png?alt=media&token=cdf55544-b5f2-44dc-ae4b-2c66bf5ad7d7)
通过实现这种逻辑,您可以减少编写的代码量,但是到目前为止,即使我们看到许多重要的快捷方式,还不是全部,我们还是从中学到了直接从模型中操作数据的最佳实践,但是在视图中分配它并不是一个好方法。
为什么?
调用数据库查询是Rails最昂贵的部分之一,实例变量一次只设置了对象的所有信息:在控制器中创建实例变量后,这意味着您只能访问一次数据库对于每个对象,并与从视图调用的范围(每次使用查询方法都会在其中调用数据库)进行比较,则控制器中的分配要好得多。 为了使用已调用的数据,您应该在声明实例变量的控制器中完成所有分配工作 ,如以下示例所示:
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-674828yt.png?alt=media&token=2555af0e-9bf9-45ba-a728-0e6468e3bc13)
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-3o4e28f0.png?alt=media&token=ec7520b9-7d67-40a9-8557-de1a11b2d4f2)
这种实现将引导您优化代码,应用最佳实践,在计划Rails应用程序时保持审慎,并构建自己的查询界面,并考虑Rails所拥有的查询方法的多样性和功能。你的申请。 我们去试试吧!
PS:最后但并非最后,您始终可以使用locals在部分内部传递自定义数据库变量:
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-hc4u2839.png?alt=media&token=131d1e3b-d648-49ec-a0e3-fcc4ba8c9f2c)
或确定是否需要使用数据库:
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2F9bw1UawxThU5LjlbhHY3Q1II3G72-095m281l.png?alt=media&token=af27f2de-cee5-49ce-9028-208216a5f64d)
它始终取决于您,选择合理。
翻译自: https://hackernoon.com/meeting-the-query-interface-in-ruby-on-rails-9bu3yec
ruby on rails