在父 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.all
,default_scope
中的方法 self.to_s
将应用于 Product
class =(
所以,这里是问题:我如何在父 class 的 default_scope
中使用 Orange
class 名称(Product
) 如果我不想在 Orange
class 中编写任何方法(因为有很多像 Orange
这样的子 class,我想让一切干燥)。
等等,如果我有 Apple
class,如果我调用 >> Apple.all
,它的名称必须用于过滤所有 Product
和 default_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_scope
或 after_initialize
,因为 Rails 已经涵盖了您从另一个模型继承而来的内容 Rails 会假设您正在使用 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
class 就像我需要的那样
但是
如果我调用 >> Orange.all
,default_scope
中的方法 self.to_s
将应用于 Product
class =(
所以,这里是问题:我如何在父 class 的 default_scope
中使用 Orange
class 名称(Product
) 如果我不想在 Orange
class 中编写任何方法(因为有很多像 Orange
这样的子 class,我想让一切干燥)。
等等,如果我有 Apple
class,如果我调用 >> Apple.all
,它的名称必须用于过滤所有 Product
和 default_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_scope
或 after_initialize
,因为 Rails 已经涵盖了您从另一个模型继承而来的内容 Rails 会假设您正在使用 STI 并且它将在查询中添加正确的内容。