在父 class 方法中调用子 class 方法

calling child class method in parent class method

我有 rails 4 个应用程序和这个模型

class Product < AR::Base

  default_scope -> { where(product_type: self.to_s) }
  after_initialize { self.product_type = self.class.to_s }

end

还有许多其他类似的人

class Orange < Product #Apple, Carrot, ...

end

如果我在控制台 >> Orange.new 中调用,回调 after_initialize 将按预期工作:它将实例属性 product_type 设置为 Orange,因此 self.class 是确定为 Orange class 就像我需要的那样

但是

如果我调用 >> Orange.alldefault_scope 中的方法 self.to_s 将应用于 Product class =(

所以,这里是问题:我如何在父 class 的 default_scope 中使用 Orange class 名称(Product) 如果我不想在 Orange class 中编写任何方法(因为有很多像 Orange 这样的子 class,我想让一切干燥)。

等等,如果我有 Apple class,如果我调用 >> Apple.all,它的名称必须用于过滤所有 Productdefault_scope ](某种多态关联)

谢谢。

只需在此处使用 STI:

class Product < ActiveRecord::Base
  self.inheritance_column = :product_type
end

class Orange < Product
end

# then...

> Orange.all
Orange Load (0.1ms)  SELECT "products".* FROM "products" WHERE "products"."product_type" IN ('Orange')

即。不要执行 default_scopeafter_initialize,因为 Rails 已经涵盖了您从另一个模型继承而来的内容 Rails 会假设您正在使用 STI 并且它将在查询中添加正确的内容。