我是Rails和Ruby的新手。我试图在Rails 3.2.11 app中实现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>
答案 0 :(得分:4)
不要在Rails中使用DCI模式。至少如果你希望得到一些流量。扩展现有对象目前非常慢。它崩溃了每个ruby实现的缓存机制。
我知道在过去的几周里有一些关于这种被高估的东西的模糊,但是真的:不要这样用它。这只是一个很大的麻烦和戏剧性的戏剧性。 Rails 不是一个Java框架,因此它与Java没有相同的问题。
如果您想将模型中的内容移动到模块,请使用简单的关注点,并将其硬编码到模型中。在运行时和所有环节都没有实时扩展。以下是@dhh如何使用它的要点:https://gist.github.com/1014971