如何打开 class 并将其转换为 ActiveRecord 对象? (比如让它继承ActiveRecord::Base)

How can I open a class and convert it into ActiveRecord object? (for example, make it inherit ActiveRecord::Base)

我有一个名为 Journey 的 class,其中包含很多 class 方法。现在我有了一个 table "journeys" 我也想有一个相应的 Journey ActiveRecord class。显然,我所要做的就是在 class 中添加“< ActiveRecord::Base”,但我想知道是否可以在 Rails 控制台中修改 Journey class,使其成为一个ActiveRecord class 不接触源代码?

我在谷歌上搜索了如何为 class 动态更改父级 class,但似乎这不可能?..那么还有其他方法吗?比如,用相同的名称创建新的 class,将包含旧 Journey 的所有内容,但也继承 ActiveRecord::Base?或者也许还有其他方法可以将 class 转换为 ActiveRecord class?

这不是我真正需要的东西(因为我可以在现实生活中修改项目的源代码),但我真的很好奇在理论上是否可以在 Ruby 中做 -- 我只是习惯了 Ruby 中的几乎所有内容都可以即时完成,我想知道这是否也可行?..

  class Journey
    def self.find_for(vehicle, start_date, end_date)
      # ...
    end

    # ... lots of other class methods
  end

不确定是否要修改现有的 class,但您可以定义一个新的并指向它的名称。像这样:

Journey = Class.new(ActiveRecord::Base) do
  # class body
end

您不能更改 class 的超级 class。 (好吧,从技术上讲,Module#include calls Module#append_features,在大多数实现中创建了一个 include class 并使 class 成为class include 被调用,但你不能在 用户代码 中这样做。)

您将不得不更改原来的 class 定义或创建新的 class。没有办法解决这个问题。

听起来您想要的是访问原始旅程 class 中的 class 方法。 您不能合并两个 classes,但您可以代理对原始 class 的调用,例如(完全未经测试)。

class NewJourney < ActiveRecord::Base
  self.table_name = "journeys"

  class << self
    def method_missing?(method, *args, &block)
      Journey.send(method, *args, &block)
    end
  end
end