ruby-on-rails - Rails STI 覆盖范围

标签 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.

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

最佳答案

更清洁的方法如下:

  • 删除后代模型的范围
  • 引入一个类方法(即busy_factor),它将返回特定类型模型的繁忙因子。
  • 在适当的地方覆盖后代中的此类方法。
  • 将基类中的范围重写为:

    范围 :busy, -> { where('busy_factor > ?', self.busy_factor) }

  • 希望这可以帮助。

    关于ruby-on-rails - Rails STI 覆盖范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13315793/

    相关文章:

    ruby-on-rails - Rails STI和 "type"字符串的设置

    ruby-on-rails - 使用具有连接条件的 Rails STI 模型

    ruby-on-rails - 未定义的方法 `receive_message_chain'

    html - Rails 中的导航菜单

    ruby-on-rails - ActiveRecord查找具有关联 child 的所有 parent

    ruby-on-rails - 如何根据父对象的状态验证嵌套模型对象?

    sql - ActiveRecord 执行原始事务类型转换?

    ruby-on-rails - 使用 STI 时索引去哪里了?

    ruby-on-rails - Rails/Postgres 查询行按时区分组

    ruby-on-rails - 如何删除 routes.rb 中为路径中的参数生成的前缀