2010-06-11 1 views
1

Это могут быть глупые вопросы, но я хотел бы знать, что произойдет, если два пользователя сразу отредактируют некоторые данные, а затем оба сразу же отправят в submit, я предположил, что Rails обрабатывал запросы один за другим другой, и поэтому кто-то получит сообщение об ошибке, но это правильно?Что произойдет, если два человека сразу отправят изменения

Благодаря

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

Ive получил эту проверку в моей модели, а

def account_active 
    if self.active == true 
     return true 
    else 
     return false 
    end 
end 

Где активен логический набор в контроллере, если проверка прошла

+0

Я парень .NET/SQL, но вероятность того, что кто-то ударит его по той же миллисекунде, ничтожно. Обычно это то место, где вы устанавливаете свой «оптимизм/пессимизм» в своей базе данных. Сначала в выигрыше, любопытных. –

+0

Слово, которое отсутствует в этом вопросе/ответах: Concurrency – Russell

ответ

2

Как уже упоминалось в других ответах, выигрывает последняя запись.

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

Существует способ обойти это, используя номер версии или временную метку на ваших моделях, которую система может использовать, чтобы сказать «пользователь редактировал версию 1, но теперь есть версия 2» и не позволяет второму пользователю отменить первый пользовательская запись.

Удивительная серия Railscasts Ryan Bates осветила основы того, как установить это в Railscast 59: Optimistic Locking.

+0

Большое спасибо за ссылку, это именно то, что Я снова искал Райана Бэйтса на свою помощь –

0

Как и во всех условиях гонки с участием слепых, las t выигрывает, если вы не предпримете шаги для его изменения.

1

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

0

Ваш первоначальный вопрос был дан ответ, но я добавлю это:

Для проверки, вы можете просто сделать следующее

def account_active 
    self.active? 
end 

рубин неявно возвращает последнюю строку метода.

+0

Это круто ... не зная, что о Ruby, я бы написал 'return self.active'. Все, что угодно, формы' if return else return ' индуцирует шлифование зубов. –