数据库约束不像在汽车中佩戴安全带一样必须。你可以随意驾驶,一切都很好,直到出现问题。安全带(约束)保护您(数据)的安全。 因此,强烈建议您创建约束以在数据库级别强制执行数据完整性,因为高度可能发生以下情况:1)您会在Rails之外的某个时候与数据库交互;2)您会在代码中犯错导致数据无效。 数据库约束可能需要更多工作,但它节省了大量的工作,尤其是当您的代码可以对数据进行假设并且不必进行大量的有效性检查时。 ActiveRecord不支持外键的原因是因为它旨在具有数据库通用性,并且不是所有数据库系统都支持外键。
您可以使用Foreigner插件来添加外键支持。并非所有支持ActiveRecord的数据库都支持外键,因此Rails框架不将其作为核心功能包含在内。 注意:由于Rails在4.2中添加了FK支持,上述内容已不再准确。
validates :username, uniqueness: true
这样的东西在这种情况下可能会失败,因为每个应用程序实例都会检查所请求的用户名,如果找不到它就插入它。只有唯一索引可以防止这种情况的发生。总的来说,任何类似于“在数据库中当前的数据是否有效?”的检查只能由数据库本身可靠地完成。 - Nathan Long