使用ActiveSupport :: Concern实现DCI

时间:2013-01-14 06:29:06

标签: ruby-on-rails ruby ruby-on-rails-3

我是Rails和Ruby的新手。我试图在Rails 3.2.11 app中实现Data-Context-Interaction / aka DCI /范例。我有User模型one-to-manyTopic模型相关联。我试图将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>

1 个答案:

答案 0 :(得分:4)

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

我知道在过去的几周里有一些关于这种被高估的东西的模糊,但是真的:不要这样用它。这只是一个很大的麻烦和戏剧性的戏剧性。 Rails 是一个Java框架,因此它与Java没有相同的问题。

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