5

Я изучаю рельсы и читаю об оптимистичной блокировке. Я добавил lock_version столбец типа integer в таблицу articles.Rails - Оптимистическая блокировка всегда срабатывает исключение StaleObjectError

Но теперь, когда я пытаюсь обновить запись в первый раз, я получаю исключение StaleObjectError.

Вот моя миграция:

class AddLockVersionToArticle < ActiveRecord::Migration 
    def change 
    add_column :articles, :lock_version, :integer 
    end 
end 

Когда я пытаюсь обновить статью через рельсы консоли:

article = Article.first 
=> #<Article id: 1, title: "Ccccc", text: "dfdsfsdfsdf", created_at: "2015-02-20 21:58:45", updated_at: "2015-02-25 20:03:12", lock_version: 0> 

И я:

article.title = "new title" 
article.save 

Я получаю это:

(0.3ms) begin transaction 
    (0.3ms) UPDATE "articles" SET "title" = 'dwdwd', "updated_at" = '2015-02-25 20:40:36.537876', "lock_version" = 1 WHERE ("articles"."id" = 1 AND "articles"."lock_version" = 0) 
    (0.1ms) rollback transaction 
ActiveRecord::StaleObjectError: Attempted to update a stale object: Article 
+0

Возможно, это значение по умолчанию, но столбец версии блокировки должен иметь значение по умолчанию 0 (в базе данных) –

+0

Уверены ли вы это сделать в первый раз? – CodeGroover

+0

@FrederickCheung lock_version уже 0 – CodeGroover

ответ

8

Вы должны инициализировать все статьи lock_version 0. Посмотрите на запрос:

UPDATE "articles" SET "title" = 'dwdwd', "updated_at" = '2015-02-25 20:40:36.537876', "lock_version" = 1 WHERE ("articles"."id" = 1 AND "articles"."lock_version" = 0) 
     (0.1ms) 

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

+3

Итак, миграции должны были быть: 'add_column: articles,: lock_version,: integer, default: 0, null: false' – spickermann

+0

yes! Я думаю, что это должно сработать. – eritiro

+0

i голосую вниз, lock_version уже 0, и в примере автор использует консоль bin/rails – CodeGroover

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