Rails 中find_by简介及使用教程

390 阅读5分钟

Rails find_by

Rails find_by的定义

Rails find_by是一个在给定表中查找任何字段记录的选项。find_by有助于找到与用户指定的条件相匹配的第一个记录。此外,没有指定寻找与给定条件相匹配的记录的顺序。相反,如果需要查找的顺序,用户将指定顺序。最后,如果没有符合指定条件的记录,术语 "nil "将被显示。简而言之,Ruby rails find_by有助于在可用的数据集中找到记录。

Rails find_by的概述

Rails使用的是Ruby元编程。在rails中,有许多方法可以找到记录。但所有这些方法都使用对象关系映射(ORM)来映射查询和数据库。例如,find,find_by,和一些帮助查找记录的方法。在这篇博客中,我们将详细研究查找记录的find_by方法。即使我们使用不同的方法,也会产生相同的SQL。对于查找多条记录也是如此。where和find_by的主要区别是find_by只返回一条记录;我们将在where方法中得到所有匹配的记录。

find_by返回一个对象,where返回一个集合。在find中,我们用它的ID来审查一条记录。如果我们在一列中找到一条记录或信息,Find_by是一个帮助工具。它将以其命名惯例来映射搜索。例如,如果我们以 "成本 "为标题来命名一列,那么语法应该是这样的:

Model.find_by(cost:"Monthly")

另一种语法如下:

find_by(:cost, "Monthly")

以上两段代码都可以在Rails中执行。

find_by是如何工作的?

find_by的工作模式有三个简单的步骤。

第一步是给输入参数一个键或值。

比如说:

User.find_by name: 'Smith', email: 'Smith@gmail.com'

如果在第二步中找到了给定的属性,它将返回记录。如果没有找到该记录,它将返回nil。如果我们想引发ActiveRecord::RecordNotFound,我们必须使用find_by方法。在上面的例子中,如果它在特定的列中找到email id Smith@gmail.com,它将返回匹配的email id。如果没有,它将返回nil。但是这个方法的返回类型总是对象。

为什么使用find_by方法?

如果我们想在一个模型上工作,比如更新一些数据,那么只有一条记录被检索,其中的id是未知的,那么find_by在这种情况下会有帮助,因为这个方法检索的是记录,而不是放在一个数组中。下面是一个解释这个概念的例子。

irb(main):037:0> @kit = Kit.find_by(number: "1426")
Kit Load (0.9ms) SELECT "kits".* FROM "kits" WHERE "kits"."number" =
'1426' LIMIT 1
=> #<Kit id: 1, number: "1426", created_at: "2021-05-12 03:20:56",
updated_at: "2021-05-12 03:20:56", job_id: nil>
irb(main):038:0> @kit.update(job_id: 2)
(0.2ms) BEGIN Kit Exists (0.4ms) SELECT 1 AS one FROM "kits" WHERE
("kits"."number" = '3456' AND "kits"."id" != 1) LIMIT 1 SQL (0.5ms)
UPDATE "kits" SET "job_id" = $1, "updated_at" = $2 WHERE "kits"."id" =
1 [["job_id", 2], ["updated_at", Tue, 12 May 2015 07:16:58 UTC +00:00]] (0.6ms) COMMIT => true

模型find_by将接受数组,但缺点是它将只处理数组中的第一个值。例如:

Model.find\_by\_id(\[1,2,3\])

如何在rails中创建find_by_attributes?

属性将根据find_by方法中存在的属性作为一个输出返回。但它总是只返回第一个对象。在下面的例子中,find_by_attribute被用来寻找args。如果没有找到args(参数),那么nil将作为输出返回;因此,下面的代码是一个例子。

例子:

def find_by_attributes(match, attributes, *args)
conditions = Hash[attributes.map {|a| [a, args[attributes.index(a)]]}] result = where(conditions).send(match.finder)
if match.bang? && result.nil?
raise RecordNotFound, "Couldn't find #{@klass.name} with #{conditions.to_a.collect {|p| p.join(' = ')}.join(', ')}"
else
yield(result) if block_given?
result
end

用于搜索一条记录的方法

使用Rails find_by的另一个好处是,除了在没有找到匹配的记录时显示 "nil "外,我们可以编写语法,让它显示 "没有找到记录"。这是使用find_by比其他方法的一个优势。虽然这种方法有它的优点,但与其他方法相比,它也有它的缺点,在这种方法中,它将显示可用的数据集合。所以,更容易知道在一个给定的查询或数据库中可用的类似数据的数量。同时,在Rails ruby的find_by方法中没有发现这个额外的优势。find_by方法的核心应用是,当给定一个ID作为在数据库中搜索的查询时,那么关键词参数ID将被传递。对于这三种方法,生成的SQL将是类似的。最后返回的对象将是相同的。如果给定的查询不一样或者没有找到,那么使用find方法的结果将显示Record is not found,而在Ruby控制台中使用find_by时将显示nil。

结论 - Rails find_by

因此,rails find_by返回数据库中存在的第一个项目。有不同的语法来执行类似的功能。类似地,我们看到了find_by的情况。在rails中还有其他语法或方法来查找数据库中的记录。它们被称为where和find。所有这些方法几乎都是类似的工作。但主要的区别是,在find_by中,它要么返回第一个匹配的属性,要么返回nil。在其他方法中,则有些不同。Rails find_by还可以搜索给定数组中的关键词。它可以在给定的列中搜索一条记录。Find_by对于我们想要引发的异常情况更加明确。Find_by遵循惯例中的bang方法。所以,这个方法在被调用时引发了一个异常。