1

我是 Rails 和 Ruby 的新手。我正在尝试在 Rails 3.2.11 应用程序中实现 Data-Context-Interaction /aka DCI/ 范例。我有与User模型one-to-many关联的Topic模型。我正在尝试编写一个mixin User,但它们不起作用,请您提供一些调试帮助。

我的混合看起来像:

module Speaker

  extend ActiveSupport::Concern

  included do
    has_many :assigned_topics, class_name: 'Topic', foreign_key: 'speaker_id'
  end

  def add_topic(topic)
    topic.speaker = self
    topic.save
  end

  def remove_topic(topic)
    topic.speaker = nil
    topic.save
  end
end

当我运行以下代码时,出现错误:

u = User.first
u.extend Speaker
u.assigned_topics
NoMethodError: undefined method `assigned_topics' for #<User:0x00000002f5dca8>
4

1 回答 1

4

不要在 Rails 中使用 DCI 模式。至少如果您希望获得一些流量。扩展现有对象目前非常缓慢。它使每个 ruby​​ 实现的缓存机制崩溃。

我知道在过去的几周里,这种被高估的东西有些模糊,但实际上:不要以这种方式使用它。这只是一个大麻烦和很多戏剧性。Rails不是Java 框架,因此它没有像 Java 那样的问题。

如果您想将东西从模型移动到模块,请使用简单的关注点,并将其硬编码到模型中。在运行时没有实时扩展和所有的箍。这是@dhh 的要点如何使用它:https ://gist.github.com/1014971

于 2013-01-14T08:05:14.933 回答