2013-05-24 4 views
5

В моей модели у меня есть это:Правильный способ предотвратить дублирование записей в Rails

validates :name, :presence => true, :uniqueness => true 

В мой контроллер у меня есть:

... 
if @location.save 
    format.html { redirect_to @location, :notice => 'Location was successfully created.' } 
    format.json { render :json => @location, :status => :created } 
... 

успешно создает запись, если нет уже запись с этим именем в таблице. Я думаю, что лучше проверить, прежде чем вставлять, возможно, дублируемую запись, вместо того, чтобы полагаться на ограничения БД?

Думаю, я должен добавить что-то к контроллеру, чтобы проверить? Каков правильный способ сделать это?

Большое спасибо.

ответ

6

Проверки выполняются Rails до того, как запись попадет в базу данных. Если запись не прошла проверку, она не будет сохранена, и .save вернет false, что приведет к выполнению предложения else вашего контроллера. Эта статья обычно перенаправляет страницу, которая была отправлена, с отображаемыми ошибками, чтобы их можно было исправить.

Предполагая, что ваш контроллер построен так, вам не нужно ничего делать. Вы должны, естественно, убедиться, что любые ограничения базы данных отражаются в ваших проверках, иначе запись может пройти проверку, но приведет к ошибке при нарушении ограничения при ее сохранении.

5

Вам не нужно ничего делать в контроллере.

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly. 
2

У вас есть правильный способ проверки уникальности в Rails, а также с помощью проверок. Вам не нужно проверять это на контроллере, потому что это то, что делает валидация для вас.

Помните, что добавление проверки уникальности не гарантирует, что у вас будет уникальная запись в db. Это хорошо объясняется в validates_uniqueness_of documentation в api.

6

Добавить уникальный индекс в вашей базе данных. Таким образом, если что-то проскальзывает проверки модели (редко, но технически возможно), запрос на сохранение в базу данных не удастся.

4

Ваша валидация верна. Как и все другие ответы выше, однако при условии, что вы хотите проверить несколько полей, например, если у вас есть список желаний, который принимает user_id и item_id, вам нужно, чтобы каждый элемент добавлялся только один раз пользователем, для такого рода сценариев добавить этот тип проверки вашей модели

Class class_name < ActiveRecord::Base 
    validates_uniqueness_of :item_id, scope: :user_id 
end 
+0

вы можете использовать 'подтверждает: item_id, уникальность: {объем:: user_id}' относительно http://www.rubydoc.info/github/bbatsov/rubocop/Rubocop/Cop/Rails/Validation – Math

Смежные вопросы