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
循环考虑,因此他们不会得到include
和DelayedEmails
替代解决方案
假设你首先问这个问题是为了避免在你的所有类中包含多个模块......
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 单个包含多个类的主要内容,如果未能解决你的问题,请参考以下文章