提前道歉-我非常喜欢学习,并且将编写项目作为学习的一种手段。在这一个中,我正在尝试扩展 ActiveRecord 以便我可以执行以下操作...
在我的模型定义中,调用...
attr_special :field, :field
然后,在其他地方,能够通过类似的方式访问此列表
Model.special_attributes
可能是非常明显的事情。我很好地扩展了 ActiveRecord,但我什至不确定我在寻找什么之外的指导(构造函数?)......
提前道歉-我非常喜欢学习,并且将编写项目作为学习的一种手段。在这一个中,我正在尝试扩展 ActiveRecord 以便我可以执行以下操作...
在我的模型定义中,调用...
attr_special :field, :field
然后,在其他地方,能够通过类似的方式访问此列表
Model.special_attributes
可能是非常明显的事情。我很好地扩展了 ActiveRecord,但我什至不确定我在寻找什么之外的指导(构造函数?)......
您可以定义类似下面的代码来在您的模型中创建自定义 DSL:
module SpecialAttributes
module ClassMethods
def attr_special(*attrs)
class_attribute :special_attributes
self.special_attributes = attrs
end
def special_attributes
self.special_attributes
end
end
module InstanceMethods
# some code here
end
def self.included(base)
base.extend ClassMethods
base.send :include, InstanceMethods
end
end
class ActiveRecord::Base
include SpecialAttributes
end
我重新打开 ActiveRecord::Base 类而不是使用继承,因为在 Ruby 中继承更常见。
我喜欢在我的模块中使用名为 ClassMethods 和 InstanceMethods 的子模块,并使用 self.included 方法将它们添加到基类中。因此,您可以使用“include MyModule”,而不必知道是否添加了实例或类方法。
我希望我能帮助你。