Запретить сохранение дубликатов в активной записи и вернуть дублированный объект - PullRequest
1 голос
/ 20 января 2012

У меня есть несколько проблем с дублирующимися записями в моей базе данных, которые, по моему мнению, вызваны тем, что люди нажимают кнопку «Отправить» несколько раз.Я использую Rails 3.

Возвращать дублированный объект, а не false

Я хотел бы иметь возможность предотвратить добавление дубликатов в мою базу данных, но предпочел быэто если при сохранении дубликата был возвращен дублированный объект, а не false.Причина в том, что если кто-то нажимает кнопку «Отправить» несколько раз, я бы хотел, чтобы его перенаправили на страницу, показывающую ему элемент, который они отправили в первую очередь, а не на страницу с ошибкой.1010 *

Я определяю дубликат как элемент, в котором все поля, кроме идентификатора, одинаковы, и create_at> Time.now - 1.минута

Нет JavaScript

Я бы предпочел сделать это на стороне сервера, а не просто отключить кнопку в JavaScript, так как я не считаю целостность базы данных работой клиента.Кроме того, такое ощущение, что это должно быть сделано в модели, а не в контроллере.Я использую несколько пассажиров, поэтому в идеале любое решение должно как можно больше избегать проблем с параллелизмом.Тем не менее, несколько повторных случаев не повредят сайт.

Спасибо.

1 Ответ

0 голосов
/ 20 января 2012

Решение ActiveRecord

ActiveRecord имеет концепцию динамических искателей :

User.find_or_create_by_first_name_and_last_name_and_age_and_whatelse(first_name,
    last_name,
    age,
    whatelse)

Не уверен, как разместить здесь свою логику "последней минуты".

Альтернативное решение

Я бы сделал примерно так:

  1. По нажатию пользователя вставьте новую запись.Запомните его идентификатор.

  2. Проверьте, не были ли похожие записи уже опубликованы в последнюю минуту.

  3. Если была одна (или несколько), удалитеновую запись, извлеките и верните самую старую.

  4. Если не было существующей записи, верните новую.

Сначала лучше, чем «проверьте, затем вставьте ", потому что это избегает условий гонки.

Это создаст некоторые пробелы в последовательности идентификаторов.Некоторым людям это не нравится.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...