验证:名称,唯一性:{scope:user_id}

时间:2013-05-20 00:39:33

标签: ruby-on-rails unique data-integrity

我在我的模型中添加了类似这样的验证:

validates :name, uniqueness: {scope: user_id}

在我的迁移中添加了类似这样的add_index:

add_index(:posts, :name)

但我刚刚在rails api page上阅读了关于数据完整性的部分。

我想知道我的模型是否会出现任何完整性错误,所以我的问题是:我应该将索引重写为吗?

add_index(:posts,[:name,:user_id]),unique:true

全心全意,

2 个答案:

答案 0 :(得分:3)

您正在谈论的数据完整性可以在您可能已经知道的2个级别强制执行:在应用程序级别和数据库级别。

在应用程序级别:您添加的验证。 在数据库级别:您建议的索引

您已经设置了第一个。因此,只要所有内容都通过您的Rails模型保存在db中,您将不会遇到任何数据库完整性问题。

但是,如果其他第三方应用程序可能会写入您的数据库,那么在数据库级别强制执行唯一性也不是一个坏主意。

即使第一个足够,建立第二个也不是一个坏主意。

此外,如果您经常查询与user_id相关联的名称,实际上最好使用add_index(:posts, [:name, :user_id]),从而加快查询速度。

答案 1 :(得分:1)

是的 - 这将是一个好主意。您的模型验证意味着复合主键。