如何在Ruby的继承父方法中获取Child class?

How to get Child class in inherited parent method in Ruby?

我正在为 Ruby 中的 SQL 数据库编写 classes,一些查询方法在我所有的 classes 中都很常见,所以我想将这些方法移动到父 class。我不知道如何让原始 class 调用显示在父 class 中。由于我的 classes 是我的 tables 的名称,我需要他们在我的父方法中访问它们。我试过使用 self.class 但只是 returns Class,而不是我正在使用的实际 class 方法。

这是我要移入父级的代码class:

require_relative 'questions_databse.rb'

class User
  attr_accessor :id, :fname, :lname

  def self.find_by_id(id)
    user = QuestionDatabase.instance.execute(<<-SQL, id)
     SELECT
       *
     FROM
       users
     WHERE
       users.id = ?
    SQL
    user.map { |user| User.new(user) }.first
end

现在我需要做的是这样的:

require_relative 'questions_databse.rb'
require_relative 'modelbase.rb'

class User < ModelBase
  attr_accessor :id, :fname, :lname

  # no self.find_by_id(id)

然后我希望父 class 做这样的事情:

require 'active_support/inflector'

class ModelBase  
  def self.find_by_id(id)
    object = QuestionDatabase.instance.execute(<<-SQL, id)
      SELECT
        *
      FROM
        #{self.chid_class.name.tableize}
      WHERE
        #{self.chid_class.name.tableize}.id = ?
    SQL
    object.map { |object| self.child_class.new(object) }.first
  end
end

我还有 4 个其他 table class 使用此方法,因此我需要能够让代码准确说明 class 调用它的内容,以便SQL 查询将 运行 正确。

require 'active_support/inflector'

class ModelBase  
  def self.find_by_id(id)
    p self.class.name
  end
end

User.find_by_id(1) #=> "Class"

这是我使用 self.class.name

时的结果

我现在正在学习如何编码,这就是课程给我的问题。我知道可能有更简单的方法可以做到这一点,但我可能还没有学会。

在像你的 find_by_id 这样的 class 方法中:

class ModelBase  
  def self.find_by_id(id)
    p self.class.name
  end
end

self 是 class 本身(所以 self.classClass)所以你想看看 self.name:

class ModelBase  
  def self.find_by_id(id)
    p name
  end
end