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_count
0にしますか?したがって、現在の値が0でカウンターが減少した場合posts_count
でも、0のままになりますか?私にできるもう1つのことは、decrement_counter
負の値を設定しないようにすることです。それは可能ですか?
(これは検証としては機能しないはずですが、エラーが表示されたくないので、デフォルトの動作として機能するはずです。)