【发布时间】:2015-01-23 21:04:09
【问题描述】:
我有 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,default_scope 内部的方法self.to_s 将应用于Product class=(
所以,问题来了:如果我不想在 default_scope 的父类 (Product) 中使用 Orange 类名,以防我在 @ 中编写任何方法987654337@ 类(因为有很多像Orange 这样的子类,我想让所有东西都干)。
等等,如果我有Apple 类,如果我调用>> Apple.all(某种多态关联),它的名称必须用于过滤所有Product 和default_scope(某种多态关联)
谢谢。
【问题讨论】:
-
不是您问题的答案,但您知道您是否使用STI ActiveRecord 如果您在子类上调用查询方法,它会为您做到这一点吗?
Product.all.to_sql => "SELECT * FROM products"与Orange.all.to_sql => "SELECT * FROM products WHERE type = 'Orange'" -
@NathanWallace,结果是一样的:
SELECT products.* FROM products WHERE products.product_type = 'Product' -
如果子类(橙色)尚未加载,可能会发生这种情况——这是 require_dependency 有用的少数情况之一
-
@FrederickCheung,那么递归依赖
(Product->Orange->Product...)不会发生吗? -
没有。 Orange 不会导致 Product 被第二次加载,因为它已经被加载了。
标签: ruby-on-rails ruby polymorphism polymorphic-associations sti