我应该在哪里放置与模型相关但与数据库操作无关的Rails代码?

时间:2013-02-12 23:53:17

标签: ruby-on-rails

我有一个使用文档扫描程序的Rails应用程序(Epson WorkForce 545)。我有两个模型:文档和扫描仪。 我很难确定应该将代码放在实际扫描操作的哪个位置。我最初认为我应该在Scanner模型中使用 scan 方法来存放代码。但是,根据我的阅读,我应该只在模型中保留与数据库相关的操作(参见Yehuda's answer here)。在模型中使用扫描仪逻辑似乎违反了这个想法。

然后我想我应该创建一个名为ScannerUtilities的模块并将其放在/ lib文件夹中。我认为这样可行,但是如果将与模型密切相关的代码卡在/ lib文件夹中,是否有意义?此外,由于扫描仪用于创建Document对象,我正在从Document控制器调用 scan 方法。因此,代码涉及多个模型和控制器。

从我的OO思想来看,应该将对象的作用定义为该类的方法。因此,如果扫描仪扫描,扫描方法是否应该在扫描仪模型中?

放置此代码的最佳位置在哪里?

谢谢!

2 个答案:

答案 0 :(得分:2)

你是对的,scan method应该在扫描仪类中,原因如下:

  • 自然主义:扫描是扫描仪的功能;在面向对象的世界中,你有扫描仪,他们所做的一件事就是扫描东西
  • 干密码:您可以从任何地方调用扫描方法;在控制器中,您需要在需要它的每个控制器中复制它;不是dry
  • 胖模型:它遵循“胖模型,瘦小的控制器”范例 - 看看this presentation
  • 语言:这是惯用且直观的。有些人可能不同意我,但我认为Rails鼓励你用英语思考而不是用Ruby思考。只是谈论它清楚地表明扫描仪扫描事物

所以是的,我会把scan method放在canner模型中。

答案 1 :(得分:0)

我会支持混合"方法

考虑创建一个用于执行扫描的类,但通过扫描仪模型访问它:

class Scanner

  def scan
    ScanExecutor.new(scanner: self).call
  end

end

这既满足了扫描仪的自然方法,也扫描了扫描仪的功能,以及实用程序与模型的分离,这将防止您的脂肪模型变得肥胖。

它还鼓励定义扫描操作的良好代码,因为它不必被压缩到单个方法中,而是可以是一个结构良好的类。