5

मैं रेल सीख रहा हूं, और आशावादी ताला के बारे में पढ़ता हूं। मैंने प्रकार integer के कॉलम को articles तालिका में जोड़ा है।रेल - आशावादी लॉकिंग हमेशा आग लगती है 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

आप क्वेरी में 0. देखो करने के लिए सभी लेख 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) 

, तो ढांचा मान लें कि आप संस्करण अद्यतन या में वस्तु नष्ट कर दिया है एक और धागा

+3

है इसलिए माइग्रेशन होना चाहिए था: 'add_column: articles,: lock_version,: integer, default: 0, null: false' – spickermann

+0

हाँ! मुझे लगता है कि काम करना चाहिए। – eritiro

+0

मैं वोट देता हूं, lock_version पहले से ही 0 है, और उदाहरण में, बिन/रेल कंसोल – CodeGroover

संबंधित मुद्दे