我有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.all
,self.to_s
内的方法default_scope
将应用于Product
class =(
所以,这是问题:如果我不想要的话,如何在父类(Orange
)default_scope
内使用Product
类名在Orange
类中编写任何方法(因为有许多子类,如Orange
,我想把所有的东西都留下干燥)。
依此类推,如果我有Apple
类,如果我调用Product
(某种多态),则必须使用该名称来过滤所有default_scope
和>> Apple.all
协会)
答案 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_scope
或after_initialize
,因为一旦从其他模型继承Rails就已经覆盖了Rails会假设您正在使用STI并且它将在查询中添加正确的内容