Rails STI覆盖范围

时间:2012-11-09 20:50:03

标签: ruby-on-rails activerecord sti

假设我有一个STI设置如下:

class User < ActiveRecord::Base
  scope :busy, -> { where('busy_factor > 1') }
end

class HeroUser < User
  scope :busy, -> { where('busy_factor > 5') }
end

因此,英雄用户对繁忙范围有不同的阈值。

现在,如果我这样做,我会收到警告:

Creating scope :busy. Overwriting existing method HeroUser.busy.

一切似乎都能正常运作,但我想知道是否有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:8)

更简洁的方法如下:

  1. 删除后代模型的范围
  2. 介绍一种类方法(即busy_factor),它会返回特定类型模型的繁忙因子。
  3. 在适当的后代中重写此类方法。
  4. 将基类中的范围重新表示为:

    范围:忙, - &gt; {where('busy_factor&gt;?',self.busy_factor)}

  5. 希望这有帮助。