5

Sto imparando le rotaie e leggo il blocco ottimistico. Ho aggiunto la colonna lock_version di tipo integer nella tabella articles.Rails - Il blocco ottimistico fa sempre scattare l'eccezione StaleObjectError

Ma ora ogni volta che cerco di aggiornare un record per la prima volta, ottengo l'eccezione StaleObjectError.

Ecco la mia migrazione:

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

Quando provo l'aggiornamento di un articolo attraverso le rotaie console:

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> 

E io fare:

article.title = "new title" 
article.save 

ottengo questo:

(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

Forse è l'impostazione predefinita, ma la colonna della versione di blocco deve avere un valore predefinito di 0 (nel database) –

+0

lo stai facendo per la prima volta? – CodeGroover

+0

@FrederickCheung lock_version è già 0 – CodeGroover

risposta

8

Dovete inizializzare tutti gli articoli lock_version a 0. Guardate la query:

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) 

Se la query restituisce 0 record aggiornati, allora il quadro si supponga di aver aggiornato la versione o eliminato l'oggetto in un altro thread.

+3

Quindi le migrazioni avrebbero dovuto essere: 'add_column: articles,: lock_version,: intero, default: 0, null: false' – spickermann

+0

sì! Penso che dovrebbe funzionare. – eritiro

+0

io voto basso, lock_version è già 0, e nell'esempio, autore che usa la console bin/rails – CodeGroover