【问题标题】:Rails & ActiveRecord: Appending methods to models that inherit from ActiveRecord::BaseRails 和 ActiveRecord:将方法附加到从 ActiveRecord::Base 继承的模型
【发布时间】:2012-04-14 20:59:58
【问题描述】:

我有一个标准的 ActiveRecord 模型,具有以下内容:

class MyModel < ActiveRecord::Base
  custom_method :first_field, :second_field
end

目前,custom_method 被发送到 ActiveRecord::Base 的模块接收。该功能基本上可以工作,但当然,它附加到 每个 模型类,而不仅仅是 MyModel。因此,如果我在同一个操作中有 MyModel 和 MyOtherModel,它将假定 MyOtherModel 也有 custom_method :first_field, :second_field。

所以,我的问题是:如何将方法(例如:def custom_method(*args))附加到从 ActiveRecord::Base 继承的 每个 类,而不是将其附加到 ActiveRecord ::基地本身?

任何想法表示赞赏。

===

编辑

custom_method 目前通过以下方式附加到 ActiveRecord::Base:

module MyCustomModule
  def self.included(base)
    base.extend(self)
  end

  def custom_method(*args)
    # Zippity doo dah - code goes here
  end
end

ActiveRecord::Base.send(:include, MyCustomModule)

【问题讨论】:

  • 听起来关键是custom_method 做了什么?
  • 打开 ActionView::Helpers::FormHelper --> fields_for & 将来自 custom_method(*args) 的 args 附加到任何 form_for 的顶部(包装在 h1 标签中)。 …实际上是一个无用的宝石,但我正试图找到我的脚:宝石创造。
  • 为什么不定义一个继承自 ActiveRecord::Base 的类,并让你的模型继承自它呢?或者这是您想要完全隐藏的东西,以便其他开发人员可以继续从 ActiveRecord::Base 继承并获得功能而无需明确请求?
  • 我想看看您包含的模块以及您如何附加附加方法。您误入了元编程领域,我认为您所做的是将方法附加到基类,您应该将方法附加到元类。看看这个:reference.jumpingmonkey.org/programming_languages/ruby/…
  • 如果您从 custom_method 内部调用 define_method 只会将方法添加到相关模型中

标签: ruby-on-rails ruby activerecord


【解决方案1】:

你知道后代吗?

ActiveRecord::Base.descendants

你必须确保在调用它之前触摸模型。

在这里查看精彩的讨论:

Is there a way to get a collection of all the Models in your Rails app?

我同意上述评论者的观点,您可能需要考虑将您的方法添加到元类、中间类或模块混合中。

【讨论】:

  • 非常好 - 我怀疑这正是我的想法。 (但在我尝试之前必须用完 - 几个小时后回来)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多