Rails指南-第4部分数据库模型

在我们的以前的博客我们讨论了Rails控制器是如何充当路由、模型和视图之间的中介。今天我们将看看Rails应用程序中的模型组件。

用最简单的术语来说,模型就是我们数据库中的一个表。这样的模型可以有不同的列,两个或更多的模型可以通过共享的列进行链接,你可以在模型内部定义自定义作用域,并让控制器利用它,等等。

看看我们的app from。它只有一个名为Book的模型。从基模中。rb file, we can see it has three columns (title, audience, isbn) that we created, as well as two columns (created_at, updated_at) automatically brought in by Rails.

它是使用我们上一篇博客中的Rails模型生成器创建的,语法如下:

rails g model图书标题:string受众:string isbn:integer

在app/models文件夹中,我们创建一个author。rb文件,它将是一个继承自ApplicationRecord的Author类。

第二部分是创建实际的表。我们可以再次运行一个迁移命令:

Rails迁移create_authors

运行rails db:migrate以创建authors表。我们可以检查我们的图式。rb file to make sure everything is as planned:

我们可以使用迁移文件向模型中添加列。如果我们想要添加一个名称列到它,在终端,我们可以运行命令:

Rails迁移add_name_to_authors名称:字符串

这将在db/migrate文件夹中创建一个迁移文件。

运行rails db:migrate在你的终端将添加的名字列添加到作者表。

类似地,我们可以用以下命令删除列:

Rails迁移remove_name_from_authors名称:字符串

如果改变主意,只需删除迁移文件。确保迁移还没有运行rails db:migrate

Rails还提供了一个强大的生成器选项,可以用一行命令创建模型、表和列迁移,因此您不必创建模型、创建表,并逐个添加单个列。假设我们要创建一个带有名称列的发布者模型。我们可以运行:

rails g model发布器名称:字符串

您将在模型中执行的最常见的任务之一是将表与助手方法连接在一起。假设我们想在三个模型之间实现以下关系:

一个作家会有很多书。出版商会有很多书。(暂时忽略一本书可能是由多个作者写的这一事实)在这样一对多的关系中,它是对象的引用的列超级模型。

要在Book模型中添加这样的列,我们可以再次使用迁移:

Rails迁移add_columns_to_books作者:references publisher:belongs_to

注意,引用和belongs_完成了相同的事情。两者之间没有区别。

运行rails db:再次迁移。我们可以看到添加了列。

现在,我们可以创建具有与之关联的作者和出版商id的图书。在现实生活中,我们可能希望从特定的作者或出版商那里查询书籍。Rails为我们提供了一些有用的助手方法,而不是使用循环。

作者内部。rb和出版商。rb files, we can call the has_many method:

从图书的角度来看,我们还可以使用helper方法查询图书的作者或出版商:

我们甚至可以通过joiner表格书连接作者和出版商。想象一下,作者M·阿基诺写了三本书:《哈希表分析》和《极客文化》出版社合作,《二进制堆》和《技术宅男》出版社合作,《数据可视化》和《极客文化》出版社合作。

如果我们要查询阿基诺所有书籍的出版商,要找到他所有的书,需要很长的一段路,然后从这些书中,找出与这些书相关的所有出版商。但在Rails中,我们可以用一行代码完成所有这些:

让我们更新我们的种子。rb file and see everything in action in Rails console.

我们的book对象现在需要一个author_id和publisher_id,让我们把它们放进去。我们可以重新播种。rb file with the command:

rails db:重置

在Rails控制台中,运行几个简单的命令,比如Author。首先,书。数数以确保所有的种子都是正确的。

现在让我们尝试一下辅助方法。在这里,我创建了一个名为aquino的变量,并存储Author。第一个进去。只要给阿基诺打电话。书和阿基诺。发布者,数据库能够将所有相关的信息拉回给我!

在接下来的一周中,我们将看看在模型中我们还能做些什么,比如验证数据、自定义作用域和模型关注点!见到你!

Baidu