0

posts_countタグの投稿数のカウンターキャッシュとして機能する列を持つタグモデルがあります。

schema.rb:

 t.integer  "posts_count", :default => 0, :null => false

tagging.rb:

 def decrement_tag_counter_cache
    Tag.decrement_counter(:posts_count, self.tag.id) if !post.published? || post.decrement_tag_counters? 
  end

post.rb:

  after_save :increment_decrement_tag_counters # covers :save, :create, :update methods

  def increment_tag_counters? # if status changes and the previous status wasn't "Published"
    status_changed? && changed_attributes["status"] != "Published"
  end

  def decrement_tag_counters? # if status changes and the previous status was "Published"
    status_changed? && changed_attributes["status"] == "Published"
  end

  def increment_decrement_tag_counters
    if published? && increment_tag_counters?
      taggings.each { |tagging| tagging.increment_tag_counter_cache }
    elsif decrement_tag_counters?
      taggings.each { |tagging| tagging.decrement_tag_counter_cache }
    end
  end

ここでの問題は、decrement_tag_counter_cacheメソッドがposts_count負になる場合があることです(たとえば、-1)。

Railsに伝える方法はありますか:最小値をposts_count0にしますか?したがって、現在の値が0でカウンターが減少した場合posts_countでも、0のままになりますか?私にできるもう1つのことは、decrement_counter負の値を設定しないようにすることです。それは可能ですか?

(これは検証としては機能しないはずですが、エラーが表示されたくないので、デフォルトの動作として機能するはずです。)

4

3 に答える 3

1

次のように posts_count に検証を入れることができます

validates :posts_count, :numericality => { :greater_than_or_equal_to => 0 }

または、このようなことを行うことができます

before_save :set_posts_count

def set_posts_count
  posts_count = 0 if posts_count < 0
end
于 2012-12-29T09:49:29.133 に答える