ActiveRecord中的自引用关系:指南

现在很难想象没有社交媒体的生活。 实际上,生活的每个方面至少都有十几个应用程序可供使用,而且很可能每个应用程序都具有社交功能。 甚至Venmo,一个汇款应用程序,也具有社交功能。 社交媒体无处不在(不幸的是)。 如果您是接受培训的网络开发人员(就我而言),则必须能够“社交化”您的应用程序。 为了在您的应用程序中构建此功能,您将需要构建所谓的“自我引用”关系。 当我学习如何做时,我使用的是ActiveRecord,这是Ruby中流行的ORM(对象关系映射器)。 我搜索了很多东西,发现很多指南,其中大多数很难阅读,而且彼此之间大多不一致。 我有点学会了如何建立这种关系,但是我对自己的缺乏理解感到不满意。 因此,我进行了更多研究,并进一步了解了这种关系。 我将尝试以最佳方式安排步骤。

自我参照关系是指模型实例与同一模型的其他实例具有关系的关系。 考虑在Facebook上添加朋友,或在Twitter上关注其他人。 在这两种情况下,我(一个用户)都在与其他人(另一个用户)建立关系。 我们在数据库中执行此操作的方式是通过所谓的“多对多”关系进行。 例如,在Twitter的上下文中,这种关系允许一个用户关注许多用户,并且允许一个用户被许多用户关注。 为此,我们创建了一个联接表,该联接表将允许用户与其他用户形成关系。 那么,我们实际上该如何做呢?

步骤1

首先,我们要使用所需的任何属性来创建用户模型。 在此示例中,我使用“名称”和“电子邮件”属性创建了该模型。

在那之后,我们要创建我们的联接表,我将其称为“关系”,但是您可以随意调用它。 该表的目的是跟踪哪些用户关注其他用户。 因此,除了每种关系的唯一ID外,该表还将有两列,我分别称为“ user_id”和“ followed_user_id”。这些列中的每一个都有一个整数值,该整数表示特定的用户。 如果我关注另一个用户,则我的ID将在“ user_id”下,而我一直关注的用户的ID将出现在“ followed_user_id”下。您的迁移文件应如下所示:

创建这两个迁移后,请确保将这些文件迁移到数据库。 向前。

第二步

现在,我们必须建立这两个模型之间的关系。 在ActiveRecord中,我们在模型文件本身中执行此操作。 幸运的是,ActiveRecord给了我们很多很棒的宏来帮助我们建立这种关系。 这是您的关系模型应如下所示:

第一个“ belongs_to”指定关系实例属于用户实例。 第二个“ belongs_to”在说同样的话,但是这里有细微差别。 请记住,自引用关系是类的实例可以与同一类的其他实例具有关系的地方。 在这种情况下,用户可以关注其他用户。 在“关系”迁移中,我们创建了两个表,一个表引用了执行以下操作的用户的ID,另一个表指定了要遵循的用户的ID。 在第二个“ belongs_to”中,我们告诉ActiveRecord实例“ followed_user”是User类的一个实例(因此称为“ class_name:” User”),它引用表中的“ followed_user_id”列。

建立这种关系的最后一步是在我们的用户模型中创建关联。 用户模型如下所示:

这里有很多话。 让我们逐块地介绍它。

如果您以前使用过ActiveRecord,则您会熟悉这种类型的关系。 我们在这些ActiveRecord宏“ has_many”和“ has_many_through”的帮助下编写了“多对多”关系。第一行告诉ActiveRecord每个用户可以有许多关系(一个用户可以出现在“用户ID”下)我们的联接表不止一次)。 第二行确定通过关系,一个用户可以有许多其他用户(别名为“ followed_users”)。 这两行代码建立了我们的关注者/关注者关系的前半部分。 作为用户,我可以关注其他用户,使用这些方法,我可以看到我关注的用户。 接下来的两行代码建立逆向关系,用户可以在其中检查哪些用户跟随他:

ActiveRecord使我们的工作变得很容易,但有时我们需要对其进行明确说明。 这两行代码在功能上与前两行相同。 为了清楚起见,我将此关系称为“ inverse_relationships”,但您可以根据需要将其命名。 第一行告诉ActiveRecord一个用户与其他用户有许多“ inverse_relationships”,当前用户的ID将在“ followed_user_id”下找到(这就是“ foreign_key”的含义。我们必须明确告诉ActiveRecord我们是引用Relationship类,第二行指定方法“ inverse_followed_users”将返回一个User对象数组,这些用户将成为跟随当前用户的用户,仅此而已,现在您知道如何创建社交媒体了!