在DB中达到多个记录时触发操作

时间:2013-08-08 12:51:12

标签: ruby-on-rails activerecord heroku

我有一个应用程序,用于存储名为kpivalue的对象的记录。每个用户可以存储有限数量的记录,其中包括数千个记录。因此,我需要了解用户何时达到限制。

我知道我可以计算它们,例如使用active_record的after_create回调来检查状态。

但是有更优化的方式吗?创建后我不需要算数?达到限制时会触发操作的东西。

我正在使用Heroku和postgresql以及Rails 3.2.8

2 个答案:

答案 0 :(得分:0)

当关联中的项目数量达到某个数字时,可以触发某个操作,但除非他们尝试添加超过限制的数量,否则您真的需要担心吗?

我建议您通过阻止用户超出限制而不是响应它们达到限制来解决此问题。

您可以验证相关项目的数量,如下所示:

class User
  has_many :kpivalues
  validate :kpivalues_within_limit

private

  def kpilimit
    5000
  end

  def kpivalues_within_limit
    return if self.kpivalues.blank?
    errors.add("You may only have #{kpilimit.to_s} kpivalues") if self.kpivalues.count > kpilimit
  end
end

答案 1 :(得分:0)

after_create是Rails解决这个问题的方法。如果需要更高的效率,可以使用SQL触发器在达到限制时引发SQL异常,这可能比在应用程序级别上检查要快一些。这也会以更强的方式强制执行检查,因为您无法在ActiveRecord模型之外突破限制,即使在rails应用程序之外使用直接SQL查询也是如此。话虽这么说,after_create可能就是你所需要的,而且比SQL触发器更易于使用。