首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为列0确定最小值(或防止decrement_counter设置负值)?

如何为列0确定最小值(或防止decrement_counter设置负值)?
EN

Stack Overflow用户
提问于 2012-12-29 09:40:14
回答 3查看 2.6K关注 0票数 0

我有一个带有posts_count列的标记模型,它充当标记拥有的帖子数量的计数器缓存:

schema.rb:

代码语言:javascript
复制
 t.integer  "posts_count", :default => 0, :null => false

tagging.rb:

代码语言:javascript
复制
 def decrement_tag_counter_cache
    Tag.decrement_counter(:posts_count, self.tag.id) if !post.published? || post.decrement_tag_counters? 
  end

post.rb:

代码语言:javascript
复制
  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吗?我可以做的另一件事是防止decrement_counter设置负值。这有可能吗?

(这不应该用作验证,而是作为一种默认行为,因为我不希望出现错误。)

EN

回答 3

Stack Overflow用户

发布于 2012-12-29 09:49:29

可以将验证放在posts_count上,如下所示

代码语言:javascript
复制
validates :posts_count, :numericality => { :greater_than_or_equal_to => 0 }

或者你可以做这样的事

代码语言:javascript
复制
before_save :set_posts_count

def set_posts_count
  posts_count = 0 if posts_count < 0
end
票数 1
EN

Stack Overflow用户

发布于 2014-09-11 04:05:27

这个问题可能会出现,因为据我所知,这个方法没有初始化模型实例,因此它发送了一个像下面这样的直接sql查询:

代码语言:javascript
复制
UPDATE "Tags" SET "posts_counter" = COALESCE("posts_counter", 0) - 1 WHERE "Tags"."id" = 5

如果是这样的话,我不知道如何解决这个问题,也许您可以用锁初始化一个模型实例,然后减少计数器,但是锁有其缺点。

票数 0
EN

Stack Overflow用户

发布于 2016-05-25 21:45:20

你可以做这样的事

代码语言:javascript
复制
[posts_count, 0].max
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14080437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档