因此,我尝试创建一个验证,确保用户永远不会拥有超过状态为== 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
然而,这并不起作用。有什么想法吗?
答案 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:我之前的编辑中有很多重复,所以我把它分成两个方法来干掉它。