目标是使用在子类中重写的类方法初始化类属性。以下是我的ruby类的定义:
query
我想这样做的原因是因为undefined method generate_query for class A
是每个类的常量字符串,不应该在实例化时再次创建,但它是一个复杂的字符串,它是在多个独立的部分中生成的。在方法中分离这个逻辑会使代码更清晰。但是,使用此代码,我得到def initialize
query = self.class.get_query
end
def self.get_query
self.query = self.generate_query if self.query.nil?
end
。
我在实例化类时尝试了类属性的延迟初始化,如下所示:
self.query.nil?
但是,如果首先实例化A,则会将查询初始化为A类和B类的相同值,因为$query = Order::query();
$orders = clone $query;
$orders = $orders->all();
$allorders = $orders->count();
$deliveryQuery = $query->where('status', '=', '8')->select(DB::raw('AVG(updated_at) as order_average'))->first();
将为B返回false。
答案 0 :(得分:1)
解决问题的方法很简单:
在定义self.query = self.generate_query
方法之前,您正在调用generate_query
!记住 - Ruby从上到下解释,你的类体也没有什么不同。在定义之前,您无法调用方法。
只需将代码更改为
class A
class_attribute :query
def self.generate_query
return "abcd"
end
self.query = self.generate_query
end
会让它发挥作用,但之后你会遇到另一个问题,因为行self.query = self.generate_query
只会在课堂上评估一次 - B
会引用"abcd"
查询,而不会{ {1}}。
要实现你想要的行为 - 你需要自己定义一个getter方法作为一个属性("ab2"
做同样的事情btw)
class_attribute