2015-06-16 3 views
0

Я использую 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

Вы должны поставить эту проверку в вас модель Api:

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

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

+0

И «* Это не создает ограничение уникальности в базе данных, поэтому она может что два разных соединения с базой данных создают две записи с одинаковым значением для столбца, который вы намереваетесь быть уникальным. Чтобы этого избежать, вы должны создать уникальный индекс на боте h столбцов в вашей базе данных. * " –

+0

Еще один вопрос: как установить другое сообщение для этого подтверждения? – Dreams

3

Вы можете использовать уникальный индекс в базе данных и/или уникальность проверки в классе рельсы модели.

Уникальный индекс будет создан в миграции, как это:

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

И проверка будет что-то вроде этого:

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

Вы можете убедиться, что в обоих model и migration файл. Я предлагаю вам сделать это в обоих местах, но будет работать только модель/миграция.

Обратите внимание, что применение ограничения внутри модели предоставит вам ошибки на объекте.

В вас миграции файла:

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 
Смежные вопросы