保留用户允许的记录数量

时间:2015-03-23 10:21:54

标签: ruby-on-rails

因此,我尝试创建一个验证,确保用户永远不会拥有超过状态为== live的X记录。但是他们可以有几个记录,但不能超过X。

我认为每次保存都需要检查验证。因为人们可以尝试更改状态,因此有超过X个记录,所以如果X已经存在,我不希望他们改变动作。

这是我到目前为止所得到的:

Campaign.rb

belongs_to :user
validate :amount_allowed
private 

def amount_allowed
  if user.campaigns.where(live: true).count > user.live_keywords_allowed
    errors.add(:base, "Exceeds your account limit")
  end
end

并在我的用户模型中:

has_many :campaigns
# amount of live keywords allowed depending on payment plan
def live_keywords_allowed 
  if self.plan_id == 1
    5
  elsif self.plan_id == 2
    7
  elsif self.plan_id == 3
    10
  else
    7
  end 
end
然而,这并不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您正在测试数据库中已有的数字,以及超过限制。我们说限制为5,你已经有5个,并且你正在尝试添加另一个:这不会使你的有效测试失败。

您需要测试数据库中已有的数字加上您尝试创建的数字是否会超过限制。

这应该有效:

def amount_allowed
  if self.live? && self.user_other_live_campaigns_count >= user.live_keywords_allowed
    errors.add(:base, "Exceeds your account limit")
  end
end

def user_other_live_campaigns_count
  if self.new_record?
    conditions = ["live = ?", true]
  else
    conditions = ["live = ? and id <> ?", true, self.id]
  end
  user.campaigns.where(conditions).count
end

测试的逻辑是说&#34;如果此广告系列是有效的,并且此用户已有user.live_keywords_allowed个或更多直播广告系列,不计算此,则它无效。

编辑:错误修正。我忘记了这个sql的怪癖

"where id <> NULL"

您希望这会返回ID不为空的所有记录,但它不会返回任何内容。因此,我们需要对新记录(没有id)和现有记录(具有id)进行不同的测试。

EDIT2:我之前的编辑中有很多重复,所以我把它分成两个方法来干掉它。