0

提前道歉-我非常喜欢学习,并且将编写项目作为学习的一种手段。在这一个中,我正在尝试扩展 ActiveRecord 以便我可以执行以下操作...

在我的模型定义中,调用...

attr_special :field, :field

然后,在其他地方,能够通过类似的方式访问此列表

Model.special_attributes

可能是非常明显的事情。我很好地扩展了 ActiveRecord,但我什至不确定我在寻找什么之外的指导(构造函数?)......

4

1 回答 1

2

您可以定义类似下面的代码来在您的模型中创建自定义 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”,而不必知道是否添加了实例或类方法。

我希望我能帮助你。

于 2012-04-19T22:24:53.703 回答