Rails 单个包含多个类

Posted

技术标签:

【中文标题】Rails 单个包含多个类【英文标题】:Rails single include to multiple classes 【发布时间】:2019-07-27 09:12:18 【问题描述】:

我有一个模块DelayTasks 和这个模块内的许多类。我想在DelayedTasks 中的所有类中包含另一个模块DelayedEmails,就像第一个类一样,但只有一个包含。有办法吗?

module DelayedTasks
  class A
    include DelayedEmails
  end

  class B
  end

  class C
  end

  class D
  end
end

【问题讨论】:

【参考方案1】:

看来你应该可以做到:

module DelayedTasks

  class Base 
    include DelayedEmails
  end

  class A < Base
  end

  class B < Base
  end

  class C < Base
  end

  class D < Base
  end

end

顺便说一句,在单个文件中定义多个类似乎不是一个好习惯 (IMO)。当然,它有效。但是,您最终可能会四处寻找这些类的定义位置,而如果它们位于单独的文件中,则它们的定义位置可能会更明显一些。

【讨论】:

【参考方案2】:

解决方案 1(直接):

module DelayedTasks
  class A
  end

  class B
  end

  class C
  end

  class D
  end
end

DelayedTasks.constants.each do |constant|
  constant.include DelayedEmails if constant.is_a? Class
end

但是,由于上面的文件是逐行调用的,那么如果有另一个文件在DelayedTasks 模块中添加了更多的类,并且这个文件是在上面的代码之后加载的,那么这些类不会被上面的.each 循环考虑,因此他们不会得到includeDelayedEmails

替代解决方案

假设你首先问这个问题是为了避免在你的所有类中包含多个模块......

module DelayedTasks
  module Dependencies
    def self.included(base)
      base.include DelayedEmails
      # base.include SomeOtherModule1
      # base.include SomeOtherModule2
      # ...
    end
  end

  class A
    include Dependencies
  end

  class B
    include Dependencies
  end

  class C
    include Dependencies
  end
end

【讨论】:

OP 规定“但只有一个包含”。第二种解决方案在每个类中都有一个include,OP 试图避免这种情况。没有? @jvillian 是的,我的解决方案 1 是我的直接答案。我的解决方案 2 是对 OP 的第二个可能问题的可能答案,假设他/她 1) 打算在类中添加多个包含,因此他/她首先问这个问题,或者 2 ) 只要知道上面的解决方案 2 是他/她将来可以使用的一种可能方法,他/她就会受益。虽然我本可以像你所做的那样继承继承(虽然我通常会这样做...... 我选择了包含路线(尽管我知道这与 OP 的直接问题相矛盾,即仅使用一个包含...这就是为什么我将其作为解决方案 2 的原因),但我仍然使用 @ 987654328@ 因为这是我觉得很自然的事情,因为逻辑是“包含”的东西,但还没有必要立即需要继承,并且只能有一个父类,所以我希望我的代码不引人注目。尽管如此,为了更准确地表达我的意图,我可能应该命名为:Alternative Solution 而不是 Solution 2,所以我现在将更新我的答案。

以上是关于Rails 单个包含多个类的主要内容,如果未能解决你的问题,请参考以下文章

内部包含多个类的单个 DTO 类

Rails 3中单个记录的多个外键?

Rails 中的多个数据库

使用rails 5在json中渲染多个包含

单个主机文件条目可以包含多个域/子域吗?

使用单个 XIB 和类创建多个 collectionviewcells