美文网首页
《Rails-Guides》Reading notes six:

《Rails-Guides》Reading notes six:

作者: 榆树下的小豆芽儿 | 来源:发表于2018-09-13 20:32 被阅读0次

        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 数据库后端,上面的代码会产生的输出结果

相关文章

网友评论

      本文标题:《Rails-Guides》Reading notes six:

      本文链接:https://www.haomeiwen.com/subject/tupggftx.html