我们的RoR应用程序中的一个rake任务非常复杂 - 它与外部API交互并更新包含一些社交指标的单独Rails模型。该任务及其功能仅由cron调用,但任务本身包含一些与模型相关的逻辑(如创建与其他模型所需的关联)。
所以我的问题是,我们应该把所有提供逻辑的代码放在哪里?把它放在任务中?将它移到模型的类方法?哪个更好,胖模型和瘦耙任务,或者反过来?
答案 0 :(得分:1)
在我看来,所有与API相关的类应该分开并位于app/services/
目录中,而且,我会为每个类创建adapters(例如,如果外部API将更改版本案例 - I wrote a post about this approach如果你有兴趣的话)。接下来,如果您的逻辑符合多个模型,我会将其放入app/usecases
,there is a great article about structuring Rails app。
所以我建议你根据Single Responsibility Principle分割一切。这样就可以很容易地测试和维护代码。
实施例:
SomeComplexCreatorUsecase.new(options).run
SomeComplexCreatorUsecase
创建所需的对象和关系SomeComplexCreatorUsecase
来电ExternalApi1Service.get_some_data
ExternalApi1Service.get_some_data
来电ExternalApi1Adapter.get_some_data
(可选)SomeComplexCreatorUsecase
获取所有需要的数据并执行剩余的计算答案 1 :(得分:0)
我希望制作这个(和大多数东西)"只是Ruby。"换句话说,一旦达到一定程度的复杂性,将其外包给自己的文件/模块/无论如何,并注入您需要的任何依赖项。
因此,您可以创建一个位于/lib
的单独模块,或者您认为最合适的位置。
这也简化了测试。