我知道unique: true
在Ruby on Rails迁移中使列唯一
add_index :table_name, :column_name, unique: true
我还知道validates :username, uniqueness: true
也使列唯一。
我只想用add_index :table_name, :column_name, unique: true
来使我的列唯一。
如果我只使用add_index :table_name, :column_name, unique: true
没有验证在任何模型中,我怎么能从SQL返回错误消息,并在我的rails应用程序中使用这些错误消息?
。
假设电子邮件字段是唯一的。为了使它独特,我只使用add_index :table_name, :column_name, unique: true
User.create(name: "John", email: "john@gmail.com")
User.create(name: "Sofia", email: "john@gmail.com") # it should returns an error
我怎么能得到这个错误信息,并在我的rails应用程序中使用它?
要在Rails中正确地完成uniqueness
,您需要在模型和数据库中的索引中进行验证。
只要添加validates :name, uniqueness: true
,你就会没事的。
仍然可能有一些罕见的情况下,当你得到SQL错误消息,而不是ActiveRecord错误,因为竞争条件。
更多信息:https://guides.rubyonrails.org/active_record_validations.html#uniqueness
如果你需要挽救由SQL引发的重复错误,你可以使用activerecord-rescue_from_duplicate gem。使用这个gem允许是否使用rails验证。
但是一般来说,在你的模型中添加唯一性验证并不能保证唯一性,除非你添加一个唯一的数据库索引看看这篇文章。