外键和关联
在向模型添加关联时,还必须添加外键。例如,假设您有以下模型:
类用户<ActiveRecord::基地has_many:文章结束
这里需要在列上添加一个外键posts.user_id
。这确保了在数据库级别强制执行数据一致性。外键还意味着数据库可以非常快速地删除相关数据(例如,当删除一个用户时),而不是Rails必须这样做。
在迁移中添加外键
外键可以使用add_concurrent_foreign_key
定义为Gitlab:数据库::MigrationHelpers
。看到迁移风格指南了解更多信息。
请记住,只有在删除任何孤立行之后,才能安全地向现有表添加外键。该方法add_concurrent_foreign_key
不考虑这个,所以你需要手动这样做。
级联删除
每个外键必须定义一个在删除
条款,在99%的情况下,这应该设置为级联
。
索引
当在PostgreSQL中添加外键时,列不会自动索引,因此您必须添加并发索引。不这样做将导致级联删除非常慢。
相关的删除
不要定义这样的选项依赖:摧毁
或依赖:删除
定义关联时。定义这些选项意味着Rails将处理数据的删除,而不是让数据库以最有效的方式处理。
换句话说,这是不好的,应该不惜一切代价避免:
类用户<ActiveRecord::基地has_many:文章,依赖:摧毁结束
如果您确实需要这样做,应该首先得到数据库专家的批准。
您也不应该定义任何before_destroy
或after_destroy
对你的模型进行回调除非绝对需要,并且只有在数据库专家批准时才需要。例如,如果表中的每一行在文件系统上都有一个相应的文件,那么添加一个after_destroy
钩。然而,这将非数据库逻辑引入到模型中,并意味着我们不能再依赖外键来删除数据,因为这将导致文件系统数据被留下。在这种情况下,您应该使用服务类来删除非数据库数据。