新手问题 这个验证怎么写?

xiaobai2 · 2016年09月06日 · 最后由 xiaobai2 回复于 2016年10月06日 · 2033 次阅读

现在有个添加数据的验证是这样的: 想在一个小时内做多插入两条数据,并且在一天内最多插入三条数据,同时满足这两个条件的验证怎么写? 我的思路: 自定义一个 validate,然后去匹配库里边儿的 created_at 数据 (匹配所有数据) 如:

Model.pluck(:created_at)

会得到一个 Array,然后去循环判断在一个小时内是否有多于两条数据,并且在一天内是否有多于三条数据。满足条件的话

errors.add(…….)

有没有一些好解决方法?求解!

controller#create里面验证也可以呀

validates :only_three, on: :create
def only_three
    if class.where(["created_at > ?", Time.now.beginning_of_day]).count >= 3
      errors.add(:id, "you can create only 3 items per day.")
    end
end

没有测试,但是这样写的思路应该是可以达到目的的. 其实这样的用户体验不好。你应该在new时就访问数据库检查是不是已经有 3 条记录了。如果有,就直接提示不能再创建了,而不是输入完数据提交时再检查。也就是client side validation的概念。

#2 楼 @suffering 首先感谢你的回答,不过还有两点疑问: 1,new 的时候怎么验证?写一个过滤器吗? 2,我其实想问的是在一天内的任何一个小时不能创建超过两条数据,这个 validate 怎么写?

#1 楼 @lehug 不过还是感觉写个 validate 会比较规范吧

#3 楼 @xiaobai2 , 将Time.now.beginning_of_day换成1.hours.ago, 再将 3 改成 2 不就可以了吗?至于new是没有validate的。要创建数据是需要点相应按钮的吗。你可以在 render 那个按钮前做下判断当前时间前推 1 个小时有没有创建限定的数量。如果超出,则不显示按钮并提示不能新建内容。

#5 楼 @suffering 非常感谢,已经有思路了

可以用 redis 吗?

一天内的任何一个小时最多只能发一条数据是这么写的

def only_two_by_hour
    if self.class.where("send_date > ?", 1.hours.ago).count > 1
      errors.add(:id, "1小时最多只能发2条!")
    end
  end

这样写好像不太对,求解

需要 登录 后方可回复, 如果你还没有账号请 注册新账号