0
이것은 매우 단순 해 보이고 내 인생을 비참하게 만듭니다. Rails 3.1.3.counter_cache가 증가하지 않는 이유 ... 무엇이 잘못 되었나요?
편집 : 아래의 조언에 따라 마이그레이션에 t.integer "versions_count", : default => 0을 추가하고, 롤백하고, 데이터베이스를 다시 작성합니다. 이제 versions_count 0
#version.rb:
class Version < ActiveRecord::Base
belongs_to :document, :counter_cache => true
end
#document.rb
class Document < ActiveRecord::Base
has_many :versions
end
#schema.rb:
create_table "documents", :force => true do |t|
t.text "name"
#EDIT: Added a default (see below) t.integer "versions_count"
t.integer "versions_count", :default => 0
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "versions", :force => true do |t|
t.text "name"
t.integer "document_id"
t.datetime "created_at"
t.datetime "updated_at"
end
콘솔에서 숙박 :
1.9.2-p290 :001 > d = Document.new
=> #<Document id: nil, name: nil, versions_count: nil, created_at: nil, updated_at: nil>
1.9.2-p290 :002 > d.name = "doc 1"
=> "doc 1"
1.9.2-p290 :003 > d.save
SQL (79.9ms) INSERT INTO "documents" ("created_at", "name", "updated_at", "versions_count") VALUES (?, ?, ?, ?) [["created_at", Sat, 04 Feb 2012 04:34:51 UTC +00:00], ["name", "doc 1"], ["updated_at", Sat, 04 Feb 2012 04:34:51 UTC +00:00], ["versions_count", nil]]
=> true
1.9.2-p290 :004 > v = Version.new
=> #<Version id: nil, name: nil, document_id: nil, created_at: nil, updated_at: nil>
1.9.2-p290 :005 > v.name = "v1"
=> "v1"
1.9.2-p290 :006 > v.save
SQL (1.0ms) INSERT INTO "versions" ("created_at", "document_id", "name", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Sat, 04 Feb 2012 04:35:13 UTC +00:00], ["document_id", nil], ["name", "v1"], ["updated_at", Sat, 04 Feb 2012 04:35:13 UTC +00:00]]
=> true
1.9.2-p290 :007 > d
=> #<Document id: 1, name: "doc 1", versions_count: nil, created_at: "2012-02-04 04:34:51", updated_at: "2012-02-04 04:34:51">
1.9.2-p290 :008 > d.versions << v
(0.3ms) UPDATE "versions" SET "document_id" = 1, "updated_at" = '2012-02-04 04:35:24.490334' WHERE "versions"."id" = 1
Version Load (0.2ms) SELECT "versions".* FROM "versions" WHERE "versions"."document_id" = 1
=> [#<Version id: 1, name: "v1", document_id: 1, created_at: "2012-02-04 04:35:13", updated_at: "2012-02-04 04:35:24">]
1.9.2-p290 :009 > d.save
=> true
1.9.2-p290 :010 > d.versions_count
=> nil
1.9.2-p290 :016 > v.save
=> true
1.9.2-p290 :017 > d
=> #<Document id: 1, name: "doc 1", versions_count: nil, created_at: "2012-02-04 04:34:51", updated_at: "2012-02-04 04:34:51">
1.9.2-p290 :018 > d2 = Document.first
Document Load (0.3ms) SELECT "documents".* FROM "documents" LIMIT 1
=> #<Document id: 1, name: "doc 1", versions_count: nil, created_at: "2012-02-04 04:34:51", updated_at: "2012-02-04 04:34:51">
나를 미치게 도와주세요.
편집 2 : 연결된 레코드를 제거 할 때 카운터가 값을 빼는 것 같습니다. 그러나 결코 추가 사항을 얻지 못합니다.
1.9.2-p290 :200 > d = Document.first
Document Load (0.4ms) SELECT "documents".* FROM "documents" LIMIT 1
=> #<Document id: 1, name: "doc 1", versions_count: 0, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:15:25">
1.9.2-p290 :201 > d.versions
Version Load (0.3ms) SELECT "versions".* FROM "versions" WHERE "versions"."document_id" = 1
=> []
1.9.2-p290 :202 > v1 = Version.first
Version Load (0.3ms) SELECT "versions".* FROM "versions" LIMIT 1
=> #<Version id: 1, name: "v1", document_id: nil, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:13:47">
1.9.2-p290 :203 > v2 = Version.last
Version Load (0.3ms) SELECT "versions".* FROM "versions" ORDER BY "versions"."id" DESC LIMIT 1
=> #<Version id: 2, name: "v2", document_id: nil, created_at: "2012-02-04 21:59:12", updated_at: "2012-02-04 22:11:37">
1.9.2-p290 :204 > d.versions << v1
(1.5ms) UPDATE "versions" SET "document_id" = 1, "updated_at" = '2012-02-04 22:16:09.876354' WHERE "versions"."id" = 1
=> [#<Version id: 1, name: "v1", document_id: 1, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:16:09">]
1.9.2-p290 :205 > d.versions << v2
(0.6ms) UPDATE "versions" SET "document_id" = 1, "updated_at" = '2012-02-04 22:16:15.628396' WHERE "versions"."id" = 2
=> [#<Version id: 1, name: "v1", document_id: 1, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:16:09">, #<Version id: 2, name: "v2", document_id: 1, created_at: "2012-02-04 21:59:12", updated_at: "2012-02-04 22:16:15">]
1.9.2-p290 :206 > d.save
=> true
1.9.2-p290 :207 > d
=> #<Document id: 1, name: "doc 1", versions_count: 0, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:15:25">
1.9.2-p290 :208 > d.versions
=> [#<Version id: 1, name: "v1", document_id: 1, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:16:09">, #<Version id: 2, name: "v2", document_id: 1, created_at: "2012-02-04 21:59:12", updated_at: "2012-02-04 22:16:15">]
1.9.2-p290 :209 > d.versions = []
SQL (1.8ms) UPDATE "versions" SET "document_id" = NULL WHERE "versions"."document_id" = 1
SQL (0.2ms) UPDATE "documents" SET "versions_count" = COALESCE("versions_count", 0) - 2 WHERE "documents"."id" = 1
=> []
1.9.2-p290 :210 > d
=> #<Document id: 1, name: "doc 1", versions_count: -2, created_at: "2012-02-04 21:49:31", updated_at: "2012-02-04 22:15:25">
1.9.2-p290 :211 >
기본값을 롤백하고 데이터베이스를 다시 작성하면 값은 0으로 유지됩니다. 다른 생각은 없습니까? – aaandre
편집 2 시퀀스를 다시 시도하십시오. 그러나'd.save' 다음에'd.versions.size'를 입력하고 이것이 정확한지 확인하십시오 ('.size'는 기술적으로 카운터 필드의 값을 얻는 방법입니다) –