外键和关联

在向模型添加关联时,还必须添加外键。例如,假设您有以下模型:

用户<ActiveRecord::基地has_many:文章结束

这里需要在列上添加一个外键posts.user_id。这确保了在数据库级别强制执行数据一致性。外键还意味着数据库可以非常快速地删除相关数据(例如,当删除一个用户时),而不是Rails必须这样做。

在迁移中添加外键

外键可以使用add_concurrent_foreign_key定义为Gitlab:数据库::MigrationHelpers。看到迁移风格指南了解更多信息。

请记住,只有在删除任何孤立行之后,才能安全地向现有表添加外键。该方法add_concurrent_foreign_key不考虑这个,所以你需要手动这样做。

级联删除

每个外键必须定义一个在删除条款,在99%的情况下,这应该设置为级联

索引

当在PostgreSQL中添加外键时,列不会自动索引,因此您必须添加并发索引。不这样做将导致级联删除非常慢。

相关的删除

不要定义这样的选项依赖:摧毁依赖:删除定义关联时。定义这些选项意味着Rails将处理数据的删除,而不是让数据库以最有效的方式处理。

换句话说,这是不好的,应该不惜一切代价避免:

用户<ActiveRecord::基地has_many:文章依赖:摧毁结束

如果您确实需要这样做,应该首先得到数据库专家的批准。

您也不应该定义任何before_destroyafter_destroy对你的模型进行回调除非绝对需要,并且只有在数据库专家批准时才需要。例如,如果表中的每一行在文件系统上都有一个相应的文件,那么添加一个after_destroy钩。然而,这将非数据库逻辑引入到模型中,并意味着我们不能再依赖外键来删除数据,因为这将导致文件系统数据被留下。在这种情况下,您应该使用服务类来删除非数据库数据。

Baidu
map