如何扩展 Rails 模型?
How to extend Rails models?
说,我有一个 Rails 模型,方法是:
class Order < ApplicationRecord
def process
do_some
do_some_more
do_even_more_here
end
end
它的目的完全是 Rails 基于模型的,这意味着它的动作是在对象本身上执行的。如果我想重构此方法并将其移出其他地方,最好的设计模式是什么?
到目前为止我发现 Decorator
不应该是答案,因为它们更 view
相关。 ServiceObject
仅用于在没有 ActiveRecord 对象的情况下执行计算,而 Concerns
是 mixins
将责任分配给多个 (ActiveRecord) 对象。
What I've found so far is that a Decorator shouldn't be the answer as
they are more view related.
是的,装饰器模式最常用于 Rails 应用程序,以使用特定于视图的行为来装饰模型。这并不一定意味着您不能将该模式用于其他目的。
相反,您应该考虑的是,即使没有代码,模型也已经是胖对象,因为它们从 ActiveModel 和 ActiveRecord 获得了大量的特征:
- 验证
- 坚持
- 肮脏的追踪
- 类型转换
- 正在查询
- 等等
即使代码被整齐地隐藏在单独的 class 中,装饰器也可能会增加更多的脂肪。
ServiceObject is meant to only perform calculations without the
ActiveRecord object
别再听谁告诉你的了。 ServiceObject 模式实际上只是关于创建单一用途的对象,这些对象只完成一项工作并且做得很好。
ActiveJob 是 ServiceObject 模式的一个例子。是的,它甚至有一个 API 用于传递 ActiveRecord 对象。您所描述的听起来像是 ServiceObject 或 ActiveJob 的主要候选对象。
Concerns are mixins that divide responsibilities over several
(ActiveRecord) objects.
Mixins 不划分职责。他们在 class 之间共享行为。它基本上就像在一组 classes 之间复制粘贴相同的方法。
服务对象就是您要找的对象。
Mixin 和 concerns 只是一堆你想混合和共享的代码,它们可以在任何地方。
制作一个服务对象,设计它的 public 和私有接口。如果你觉得它太胖了,就把它们分开,就这么简单。可能值得阅读有关 SOLID 的内容。
说,我有一个 Rails 模型,方法是:
class Order < ApplicationRecord
def process
do_some
do_some_more
do_even_more_here
end
end
它的目的完全是 Rails 基于模型的,这意味着它的动作是在对象本身上执行的。如果我想重构此方法并将其移出其他地方,最好的设计模式是什么?
到目前为止我发现 Decorator
不应该是答案,因为它们更 view
相关。 ServiceObject
仅用于在没有 ActiveRecord 对象的情况下执行计算,而 Concerns
是 mixins
将责任分配给多个 (ActiveRecord) 对象。
What I've found so far is that a Decorator shouldn't be the answer as they are more view related.
是的,装饰器模式最常用于 Rails 应用程序,以使用特定于视图的行为来装饰模型。这并不一定意味着您不能将该模式用于其他目的。
相反,您应该考虑的是,即使没有代码,模型也已经是胖对象,因为它们从 ActiveModel 和 ActiveRecord 获得了大量的特征:
- 验证
- 坚持
- 肮脏的追踪
- 类型转换
- 正在查询
- 等等
即使代码被整齐地隐藏在单独的 class 中,装饰器也可能会增加更多的脂肪。
ServiceObject is meant to only perform calculations without the ActiveRecord object
别再听谁告诉你的了。 ServiceObject 模式实际上只是关于创建单一用途的对象,这些对象只完成一项工作并且做得很好。
ActiveJob 是 ServiceObject 模式的一个例子。是的,它甚至有一个 API 用于传递 ActiveRecord 对象。您所描述的听起来像是 ServiceObject 或 ActiveJob 的主要候选对象。
Concerns are mixins that divide responsibilities over several (ActiveRecord) objects.
Mixins 不划分职责。他们在 class 之间共享行为。它基本上就像在一组 classes 之间复制粘贴相同的方法。
服务对象就是您要找的对象。 Mixin 和 concerns 只是一堆你想混合和共享的代码,它们可以在任何地方。 制作一个服务对象,设计它的 public 和私有接口。如果你觉得它太胖了,就把它们分开,就这么简单。可能值得阅读有关 SOLID 的内容。