使用方法初始化类属性

时间:2018-03-24 13:11:33

标签: ruby

目标是使用在子类中重写的类方法初始化类属性。以下是我的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。

1 个答案:

答案 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