《Rails-Guides》Reading notes six:Active Record Query Interface

        Rails Active Record 提供了从数据库中检索数据的不同方法。无需直接使用 SQL 来查找数据库。下面列出这些查找方法:

检索单个对象

find 方法:可以使用 find 方法检索指定主键对应的对象,指定主键时可以使用多个选项。

take 方法:

take 方法检索一条记录而不考虑排序。
take 方法检索一条记录而不考虑排序。  sql
take 方法接受数字作为参数,并返回不超过指定数量的查询结果。

first 方法:first 方法默认查找按主键排序的第一条记录。

last 方法:last 方法默认查找按主键排序的最后一条记录。

find_by 方法:find_by 方法查找匹配指定条件的第一条记录。 

find_by 方法
等价于上面的find_by 方法
sql

批量检索多个对象

find_each 方法:find_each 方法批量检索记录,然后逐一把每条记录作为模型传入块。在下面的例子中,find_each方法取回 1000 条记录,然后逐一把每条记录作为模型传入块。:batch_size 选项用于指明批量检索记录时一次检索多少条记录。:start 选项用于配置想要取回的记录序列的第一个 ID,比这个 ID 小的记录都不会取回。:finish 选项用于配置想要取回的记录序列的最后一个 ID,比这个 ID 大的记录都不会取回。

find_in_batches 方法:find_in_batches 方法和 find_each 方法类似,两者都是批量检索记录。区别在于,find_in_batches 方法会把一批记录作为模型数组传入块,而不是像 find_each 方法那样逐一把每条记录作为模型传入块。

条件查询

纯字符串条件

        可以直接用纯字符串为查找添加条件。例如,Client.where("orders_count = '2'") 会查找所有 orders_count 字段的值为 2 的客户记录。

数组条件

条件中的占位符
NOT 条件
相等性条件
相等性条件sql
范围条件
范围条件sql
子集条件
子集条件sql
排序

分组

        要想在查找方法生成的 SQL 语句中使用 GROUP BY 子句,可以使用 group 方法。要想得到一次查询中分组项目的总数,可以在调用 group 方法后调用 count 方法。

unscope 方法

使用 unscope 方法删除某些条件

only 方法

可以使用 only 方法覆盖某些条件

空关系  

        none 方法返回可以在链式调用中使用的、不包含任何记录的空关系。在这个空关系上应用后续条件链,会继续生成空关系。对于可能返回零结果、但又需要在链式调用中使用的方法或作用域,可以使用 none 方法来提供返回值。

只读对象

        在关联中使用 Active Record 提供的 readonly 方法,可以显式禁止修改任何返回对象。如果尝试修改只读对象,不但不会成功,还会抛出 ActiveRecord::ReadOnlyRecord 异常。

联结表

joins 方法

在 joins 方法中可以直接用 SQL 指明 JOIN 子句
单个关联的联结
多个关联的联结

left_outer_joins 方法

N + 1 查询问题

        假设有如下代码,查找 10 条客户记录并打印这些客户的邮编:

这段代码总共需要执行 1(查找 10 条客户记录)+ 10(每条客户记录都需要加载地址)= 11 次查询。

N + 1 查询问题的解决办法

代码只执行 2 次查询,而不是之前的 11 次查询

使用 SQL 语句进行查找

        要想直接使用 SQL 语句在数据表中查找记录,可以使用 find_by_sql 方法。find_by_sql 方法总是返回对象的数组,即使底层查询只返回了一条记录也是如此。

执行 EXPLAIN 命令

在关联触发的查询上执行 EXPLAIN 命令
 MySQL 和 MariaDB 数据库后端,上面的代码会产生的输出结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容