【问题标题】:How can I open a class and convert it into ActiveRecord object? (for example, make it inherit ActiveRecord::Base)如何打开一个类并将其转换为 ActiveRecord 对象? (例如,让它继承 ActiveRecord::Base)
【发布时间】:2019-12-28 06:39:27
【问题描述】:

我有一个名为 Journey 的类,其中包含很多类方法。既然我有一张“旅程”表,我也想有一个相应的 Journey ActiveRecord 类。显然我所要做的就是在类中添加“

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

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

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

    # ... lots of other class methods
  end

【问题讨论】:

    标签: ruby-on-rails ruby inheritance activerecord monkeypatching


    【解决方案1】:

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

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

    【讨论】:

    • 是的 :) 但我想知道是否也可以保存旧的类方法,所以我不必复制它们
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      class NewJourney < ActiveRecord::Base
        self.table_name = "journeys"
      
        class << self
          def method_missing?(method, *args, &block)
            Journey.send(method, *args, &block)
          end
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多