我有两个类,Task和Subtask。子任务与Task的变化很小,除了一件重要的事情,它必须包含一个不同的模块。
包含的模块,subtask_module和task_module都有相同的方法和别名,但是在内部它们在包含的模块扩展其方法时的功能略有不同。我无法解决这个问题,因为我正在使用插件。
例如,下面,您在任务中看到belongs_to
。 belongs_to
从包含的模块扩展,但是它的功能根据我包含的模块略有不同。
class Subtask < Task
include subtask_module
end
class Task
include task_module
# methods and aliases both classes use (defined in included file)
# but behavior changes based on
# included file
belongs_to :template
end
这样做的最佳方式是什么?现在它可以像现在一样工作。但它看起来很臃肿,因为在Task中声明了我不需要的未使用的东西。
最好的方法是什么?
答案 0 :(得分:4)
你也可以把Task变成一个子类,然后让每个都继承一些常见的东西(尽可能使用你上面的名字)
class Task
belongs_to :template
end
class Subtask1 < Task
include subtask_file
end
# this used to be Task, now is Subtask2
class Subtask2 < Task
include task_file
end
或者,您将共享功能移到其自己的模块,然后包含它,并完全避免超类/子类(我会选择这个)。
module TaskShared
belongs_to :template
end
class Task
include TaskShared
include task_file
end
class Subtask
include TaskShared
include subtask_file
end
(belongs_to可能会给你带来困难。如果是这样,请尝试在附加的钩子中添加它)
module TaskShared
def self.included(klass)
klass.belongs_to :template
end
end
请注意,在某些情况下,这会变得很棘手,例如从ActiveRecord :: Base类继承。