Rails:如何组织代码 - 何时使用服务

时间:2017-02-06 22:02:54

标签: ruby-on-rails

我有2个型号:用户,员工。 User has_one :employee,员工belongs_to :user 在我的应用中:

  • 员工始终是用户
  • 可能有非员工的用户
  • 员工和用户将电子邮件作为唯一标识符

所以 - 当创建员工时,我需要检查是否有相同电子邮件的用户

  • 是 - 使用user_id更新员工
  • 否 - 使用user_id创建用户并更新员工。

这样做的代码很简单。但我想知道它应该在应用程序结构中的哪个位置:

  • 我可以在员工模型(after_create方法)中完成 - 但我必须在Employee模型中引用用户模型(这是正确的)吗?
  • 我可以在employee_controller中使用所有内容 - 但我不想将业务逻辑放在控制器中......
  • 我可以使用user_service方法创建一个名为create_user_for_employee(employee)的额外类(即在服务文件夹中) - 并在我的employee_controller中的create action中调用它

哪种解决方案最好?还是有另一个 - 更好?是"服务"具有此类的文件夹的正确名称?我假设当应用程序增长时,我将需要更多的类和方法....

1 个答案:

答案 0 :(得分:1)

Rails中的服务有几个原因可以引入。其中一个很好地匹配您的用例 - 当您需要实现的操作与多个模型相关时,使用服务。

由于您的操作与User有关,因此Employee服务肯定是您的选择。

是的,services是该文件夹的一个好名字。是的,当您的应用程序增长时,您最终可能会使用MVC模式中的许多类,例如服务,装饰器,表单等。

请随时查看7 Patterns to Refactor Fat ActiveRecord Models以便进一步阅读。那篇文章是一种规范的。