1

kpivalue というオブジェクトのレコードを保存するアプリがあります。各ユーザーは、限られた数のレコード (数千件) を保存できます。そのため、ユーザーがいつ制限に達したかを認識する必要があります。

それらを数えて、たとえば、active_record の after_create コールバックを使用してステータスを確認できることはわかっています。

しかし、それを行うためのより最適化された方法はありますか? 作成後にカウントする必要はありませんか?制限に達したときにアクションをトリガーするもの。

Postgresql と Rails 3.2.8 で Heroku を使用しています。

4

2 に答える 2

0

関連付け内のアイテムの数が特定の数に達したときにアクションをトリガーすることはできますが、制限を超えて 1 つ追加しようとしていない限り、本当に心配する必要がありますか?

代わりに、ユーザーが制限に達したことに応答するのではなく、ユーザーが制限を超えないようにすることでこれにアプローチすることをお勧めします。

次のように、関連するアイテムの数を検証できます。

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
于 2013-08-08T13:05:11.123 に答える
0

after_createこれに対処するRailsの方法です。さらに効率が必要な場合は、制限に達した場合に SQL トリガーを使用して SQL 例外を発生させることができます。これは、アプリケーション レベルでチェックを行うよりもおそらく少し高速です。Railsアプリの外部で直接SQLクエリを使用しても、ActiveRecordモデルの外部では制限を破ることができないため、これにより、より強力な方法でチェックが強制されます。これは、after_createおそらく必要なものであり、SQL トリガーよりもはるかに簡単に使用できると言われています。

于 2013-08-08T13:44:19.137 に答える