ruby-on-rails - 使用 ActiveSupport::Concern 实现 DCI

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

我是 Rails 和 Ruby 的新手。我正在尝试在 Rails 3.2.11 应用程序中实现 Data-Context-Interaction/aka DCI/范例。我有 User 模型,该模型 one-to-manyTopic 模型关联。我正在尝试为 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/

相关文章:

mysql - 如何使用 Rails Controller 页面将数据插入具有多对多关系的联接表

ruby - 打印出二维数组

jquery - 帮助 Rails3 中的 JQuery 自动完成

ruby-on-rails - Docker on Apple Silicon (M1) 中的 Ruby on Rails

ruby-on-rails - Ruby Mongo 或 Mongoid 并发问题

ruby-on-rails - Ruby on Rails : Displaying Database Data from id?

ruby-on-rails - Rails API 不拆分 Json

ruby-on-rails - Rails 合并两个 ActiveRecord::Relation 的

sql - 如何显示数千条记录

ruby-on-rails - 我如何每天验证一篇文章?