我是 Rails 和 Ruby 的新手。我正在尝试在 Rails 3.2.11 应用程序中实现 Data-Context-Interaction/aka DCI/范例。我有 User
模型,该模型 one-to-many
与 Topic
模型关联。我正在尝试为 User
编写一个 mixin,但它们无法正常工作,请提供一些调试帮助。
我的混音看起来像:
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>
最佳答案
不要在 Rails 中使用 DCI 模式。至少如果您希望获得一些流量。扩展现有对象目前非常慢。它使每个 ruby 实现的缓存机制崩溃。
我知道在过去的几周里这个被高估的东西有些模糊,但真的:不要这样使用它。这只是一个很大的麻烦和很多戏剧性的事情。 Rails 不是 Java 框架,因此它没有与 Java 相同的问题。
如果您想将内容从模型移动到模块,请使用一个简单的关注点,并将其硬编码到模型中。在运行时没有实时扩展和所有的箍。这是来自@dhh 的要点如何使用它:https://gist.github.com/1014971
关于ruby-on-rails - 使用 ActiveSupport::Concern 实现 DCI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314173/