情况是这样的,我插入的最后一条是没法通过我自定义的 validate 的,但是。。。。 如上调试所示,正常情况下应该是只能插入一条数据的,但是插入第二条的时候,居然跳过了验证。第三条以后是正常的都不能插入,这是什么情况?
validate :only_three_by_day
def only_three_by_day
if Notification::Send.where("send_date BETWEEN ? AND ? AND send_status != ?", send_date.beginning_of_day, send_date.end_of_day, 3).count > 3
errors.add(:id, "一天之内只能发3条!")
end
end
validate :only_one_by_hour
def only_one_by_hour
if Notification::Send.where("send_date BETWEEN ? AND ? AND send_status != ? ", send_date.beginning_of_hour, send_date.end_of_hour, 3).count > 1
errors.add(:id, "1个小时之内只能发1条哦!")
end
end
@jasl 首先 validate 确实执行了,我现在怀疑是我 if 条件的问题,可是感觉没问题啊,一个小时之内只能设置一条 send_date。我这有写真的没有看出毛病。。。。。。
@tesla_lee @hging @jasl 我改成>=1 了,现在确实只能添加一条数据,我的逻辑是添加成功之后到 render 到 show,他却给出了提示 我的 create 代码大概如下:
begin
if @model.save!
.....
end
rescue Exception => e
render :show
end
意思就是第一条可以添加成功,但是他也给报这样的验证提示 从逻辑上分析,还是先走了 save!,然后再从验证判断。。。。。 补充一句:如果我写成>=1 的话,我添加第一条肯定会走 errors.add 啊
从你的截图看,COMMIT 成功的那次是走了你的 validate 的,而且通过了
然后又立马起了一个事务,又执行你的 validate,没有通过,于是事务回滚了,这个时候就会抛出你收到的报错
所以我推断你的 save 被发起了两次,看上去就出现了你所说的,数据都存了,然后才 validate 的现象
如果你只想在插入数据时验证应该用 validate :only_three_by_day, on: :create
否则 update 的时候,也会触发验证
1.2 什么时候做数据验证?这一节
下列方法会做数据验证,如果验证失败就不会把对象存入数据库: create create! save save! update update! 爆炸方法(例如 save!)会在验证失败后抛出异常。验证失败后,非爆炸方法不会抛出异常,save 和 update 返回 false,create 返回对象本身。
加上 return false
class Aaa
before_save :check_num
def check_num
errors.add(:id, '不能保存就对了')
return false # 看这里
end
end
errors
, valid?
, save
之间的关系不是那么的明确。