如何在数据库中验证唯一性?

时间:2015-06-16 16:45:54

标签: ruby-on-rails validation ruby-on-rails-4

我正在使用Rails 4.2和Ruby 2.1.5。

这是我的API表:

create_table "apis", force: :cascade do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "status"
  t.string   "coname"
end

如何验证用户无法创建两次具有相同名称和相同状态的API?

例如,(姓名)" ABC" (状态)"好"已经存在,下次再也无法再创建它了。

3 个答案:

答案 0 :(得分:3)

您需要将此验证放入Api模型:

validates :name, uniqueness: { scope: :status, message: 'your custom message' }

http://guides.rubyonrails.org/active_record_validations.html#uniqueness

答案 1 :(得分:3)

您可以在数据库中使用唯一索引和/或在rails模型类中使用唯一性验证。

唯一索引将在迁移中设置,如下所示:

class AddUniqueIndexToApis < ActiveRecord::Migration
  add_index :apis, [:name, :status], unique: true
end

验证将是这样的:

class Api < ActiveRecord::Model
  validates :name, uniqueness: { scope: :status }
end

答案 2 :(得分:0)

您可以在modelmigration文件中确保这一点。我建议你在两个地方都这样做,但只有模型/迁移也可以。

  

请注意,在模型中应用限制将为您提供   对象上的错误。

在迁移文件中

def change
  create_table "apis", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "status"
    t.string   "coname"
 end
 add_index :name, :status, unique: true
end

以你的模特:

class ApiModel < ActiveRecord::Model
   validates :name, uniqueness: { scope: :status }
end