如何打开 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
我有一个名为 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