لا يتم تحديث ذاكرة التخزين المؤقت العداد ولكن يمكنني حفظ الوالد والطفل

StackOverflow https://stackoverflow.com/questions/903294

  •  05-09-2019
  •  | 
  •  

سؤال

أضفت ذاكرة التخزين المؤقت عداد ولكن لا يمكنك الحصول عليها للتحديث. ولكن يمكنني تحديث الوالد - نموذج نشر المدونة عن طريق إضافة منشور مدون جديد - ويمكنني تحديث نموذج الطفل - تعليقات التعليقات - عن طريق إضافة تعليق جديد. من المفترض أن تتبع ذاكرة التخزين المؤقت العدادية للعدد الإجمالي للتعليقات لكل مدونات وظيفة من خلال تحديث تلقائي للحقل blog_posts.comments_count. سأطرح بعض الخطوات التي مرت بها ونأمل أن يلاحظ شخص ما شيئا أخطأته. مخطط تفريغ في النهاية.

لدي نموذج آخر مدونة:

class Post < ActiveRecord::Base
  set_table_name("blog_posts")
  belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
  has_many :comments, :class_name => "Comment",
    :foreign_key => 'post_id', :order => "created_at desc", :dependent => :destroy
  has_many :categorizations
  has_many :categories, :through => :categorizations
  named_scope :recent, :order => "created_at desc", :limit => 5

end

وتعليقات نموذج مع مجموعة مشددة إلى نموذج البريد:

class Comment < ActiveRecord::Base
  belongs_to :post, :class_name => "Post", :foreign_key => "post_id", :counter_cache => true
  belongs_to :author, :class_name => "User", :foreign_key => "author_id"
end

قمت بإنشاء ترحيل لإضافة عمود Counter_Cache إلى جدول Blog_Posts:

class AddCommentCounter < ActiveRecord::Migration
  def self.up
    add_column :blog_posts, :comments_count, :integer, :limit => 4, :default => 0, :null => false
    Post.find(:all).each do |post|
      current_count = post.comments.size
      post.update_attribute(:comments_count, current_count)
    end
  end

  def self.down
    remove_column :blog_posts, :comments_count
  end
end

ولكن فشل الترحيل في تحديث مشاركات المدونة مع CHALL_COUNT. انها دائما صفر.

فتحت وحدة التحكم في القضبان في محاولة لتحديث _attribute يدويا:

Loading development environment (Rails 2.3.2)

>> p = Post.find 1
p = Post.find 1

=> #<Post id: 1, title: "test", content: "test", author_id: 1, status: "ok", created_at: "2009-05-21 19:27:14", updated_at: "2009-05-24 07:02:35", comments_count: 0>

>> p.comments
p.comments

=> [#<Comment id: 5, post_id: 1, author_id: 1, content: "Fifth Comment", status: "ok", created_at: "2009-05-24 07:08:56", updated_at: "2009-05-24 07:08:56">, #<Comment id: 4, post_id: 1, author_id: 1, content: "Fourth Comment", status: "ok", created_at: "2009-05-24 07:05:32", updated_at: "2009-05-24 07:05:32">, #<Comment id: 3, post_id: 1, author_id: 1, content: "Third Comment", status: "ok", created_at: "2009-05-24 06:34:59", updated_at: "2009-05-24 06:34:59">, #<Comment id: 2, post_id: 1, author_id: 1, content: "Second Comment", status: "ok", created_at: "2009-05-24 05:20:43", updated_at: "2009-05-24 05:20:43">, #<Comment id: 1, post_id: 1, author_id: 1, content: "First Comment", status: "ok", created_at: "2009-05-21 19:27:14", updated_at: "2009-05-21 19:27:14">]


>> p.comments.size
p.comments.size

=> 5

>> p.comments_count
p.comments_count

=> 0

>> p.update_attribute(:comments_count, 5)
p.update_attribute(:comments_count, 5)

=> true

>> p.comments_count
p.comments_count

=> 5

>> p.save
p.save

=> true

ولكن عندما أبحث في قاعدة البيانات Comments_Count = 0.

ستكون أي أفكار أكثر من محل تقدير بعيد.

بلدي schema.db يبدو وكأنه هذا:

ActiveRecord::Schema.define(:version => 20090524055907) do

  create_table "blog_posts", :force => true do |t|
    t.string   "title",          :limit => 100, :default => "", :null => false
    t.text     "content",                                       :null => false
    t.integer  "author_id",                     :default => 0,  :null => false
    t.string   "status",         :limit => 20,  :default => "", :null => false
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "comments_count",                :default => 0,  :null => false
  end

  add_index "blog_posts", ["author_id"], :name => "index_blog_posts_on_author_id"

  create_table "categories", :force => true do |t|
    t.string   "name",        :limit => 50, :default => "", :null => false
    t.string   "short_name",  :limit => 30, :default => "", :null => false
    t.string   "description",               :default => "", :null => false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "categories_posts", :force => true do |t|
    t.integer "category_id", :null => false
    t.integer "post_id",     :null => false
  end

  add_index "categories_posts", ["category_id"], :name => "index_categories_posts_on_category_id"
  add_index "categories_posts", ["post_id"], :name => "index_categories_posts_on_post_id"

  create_table "comments", :force => true do |t|
    t.integer  "post_id",                  :default => 0,  :null => false
    t.integer  "author_id",                :default => 0,  :null => false
    t.text     "content",                                  :null => false
    t.string   "status",     :limit => 25, :default => "", :null => false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "sessions", :force => true do |t|
    t.string   "session_id", :default => "", :null => false
    t.text     "data"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
  add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at"

  create_table "users", :force => true do |t|
    t.string   "username",        :limit => 25, :default => "", :null => false
    t.string   "hashed_password", :limit => 40, :default => "", :null => false
    t.string   "first_name",      :limit => 25, :default => "", :null => false
    t.string   "last_name",       :limit => 40, :default => "", :null => false
    t.string   "email",           :limit => 50, :default => "", :null => false
    t.string   "display_name",    :limit => 25, :default => "", :null => false
    t.integer  "user_level",      :limit => 3,  :default => 0,  :null => false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end
هل كانت مفيدة؟

المحلول

ألق نظرة على التعليمات البرمجية المحدثة من Railscasts الحلقة 23. على counter_cache.

السمات المضادة هي attr_readonly. وبعد ربما تحديث العدادات هو ما تحتاجه لاستخدامه بدلا من سمات التحديث في ترحيلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top