通过Rake调用的复杂模型相关逻辑:在哪里保留它?

时间:2014-12-23 16:18:07

标签: ruby-on-rails ruby design-patterns rake

我们的RoR应用程序中的一个rake任务非常复杂 - 它与外部API交互并更新包含一些社交指标的单独Rails模型。该任务及其功能仅由cron调用,但任务本身包含一些与模型相关的逻辑(如创建与其他模型所需的关联)。

所以我的问题是,我们应该把所有提供逻辑的代码放在哪里?把它放在任务中?将它移到模型的类方法?哪个更好,胖模型和瘦耙任务,或者反过来?

2 个答案:

答案 0 :(得分:1)

在我看来,所有与API相关的类应该分开并位于app/services/目录中,而且,我会为每个类创建adapters(例如,如果外部API将更改版本案例 - I wrote a post about this approach如果你有兴趣的话)。接下来,如果您的逻辑符合多个模型,我会将其放入app/usecasesthere is a great article about structuring Rails app

所以我建议你根据Single Responsibility Principle分割一切。这样就可以很容易地测试和维护代码。

实施例:

  • rake任务调用SomeComplexCreatorUsecase.new(options).run
  • SomeComplexCreatorUsecase创建所需的对象和关系
  • SomeComplexCreatorUsecase来电ExternalApi1Service.get_some_data
  • ExternalApi1Service.get_some_data来电ExternalApi1Adapter.get_some_data(可选)
  • SomeComplexCreatorUsecase获取所有需要的数据并执行剩余的计算

答案 1 :(得分:0)

我希望制作这个(和大多数东西)"只是Ruby。"换句话说,一旦达到一定程度的复杂性,将其外包给自己的文件/模块/无论如何,并注入您需要的任何依赖项。

因此,您可以创建一个位于/lib的单独模块,或者您认为最合适的位置。

这也简化了测试。