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

时间:2015-01-23 21:04:10

标签: ruby-on-rails ruby polymorphism polymorphic-associations sti

我有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

如果我致电>> Orange.allself.to_s内的方法default_scope将应用于Product class =(

所以,这是问题:如果我不想要的话,如何在父类(Orangedefault_scope内使用Product类名在Orange类中编写任何方法(因为有许多子类,如Orange,我想把所有的东西都留下干燥)。

依此类推,如果我有Apple类,如果我调用Product(某种多态),则必须使用该名称来过滤所有default_scope>> Apple.all协会)

谢谢。

1 个答案:

答案 0 :(得分:1)

在这里使用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')

IE中。不要执行default_scopeafter_initialize,因为一旦从其他模型继承Rails就已经覆盖了Rails会假设您正在使用STI并且它将在查询中添加正确的内容