29

将逻辑从控制器转移到模型中是一种很好的做法。但是在任何复杂的系统中,这总是会导致一个非常大的文件,即使大多数方法是按照 Rails 方式的一个衬里。

我已经采取了将模型拆分为其他模块并将它们包含在原始模型中的方法,例如 ,model_flagsmodel_validation。有人有更好的方法吗?

4

6 回答 6

28

我意识到这是一个相当古老的问题,它已被标记为已回答,但它仍然有很好的谷歌果汁,所以我认为值得添加...

Rails 3 引入了 ActiveSupport::Concern,可用于模块化跨模型共享的行为。或者,就此而言,瘦身已经变得太胖的模特。

DHH 本人在这里提供了一个很好的、简洁的示例要点:

https://gist.github.com/1014971

于 2011-08-07T03:16:46.177 回答
6

我不会这样做有几个原因。

首先,您违反了事物将在应有的位置的假设,这可能首先是对 Rails 的最大好处。如果您将模型内容粘贴到模型中,一个新人可以很容易地进入您的项目并导航它。如果你把它拉出来,你只会增加延迟和一些混乱,特别是如果将某些东西删除到模块的唯一逻辑是减小模型大小。

其次,您几乎没有从中获得任何收益,并且您会失去一些东西。如今,几乎所有编辑器和 IDE 都减轻了大文件的导航痛苦,因此文件大小已不再重要。将东西移动到一个模块实际上会消除一些现代的轻松,并且需要您和您的同事或未来的维护者在处理一个模型时跳过更多的文件。

也就是说,我怀疑铁杆最佳实践团队会告诉您的是,如果您的模型又大又复杂,那么您的设计就有缺陷,并且您的模型可能代表了可以制作成单独模型而不是模块的几件事情。

于 2009-01-01T16:14:10.143 回答
3

好吧,我不会说你们中的任何人将所有东西都放在一个模型中是错误的,但我认为能够分离各种关注点也是非常有效的。这至少是一种权衡。

我正在发布我自己问题的答案,因为我已经找到了 Rails 方式来做到这一点:http: //github.com/jakehow/concerned_with

更多信息可以在这里找到:http: //m.onkey.org/2008/9/15/active-record-tips-and-tricks

于 2009-01-09T19:41:42.167 回答
2

不了解您的对象模型,建议您有点困难,但我想说的是,如果您绝对确信所有验证/关联/回调都需要在那个地方,那么仍然有一些方法可以解决常见的行为。因此,虽然我不会将一大块代码从一个文件移到另一个文件中,它只是重新打开类,但我会说使用模块/插件来描述常见的行为类型是一个好主意。

例如,如果您正在构建 Facebook 式的活动提要,并且所有内容都需要生成“事件”,那么您可能希望将“可事件”行为移动到一个模块中,当包含该模块时,它定义了关联/验证/ETC。我想说这种方法实际上会提高代码的清晰度,因为在任何地方手动指定这些关联并不像将某些东西声明为 Eventable 那样富有表现力,也不安全(你会在很多地方重复逻辑,当逻辑发生变化时,你知道其余的......)

总而言之,我想说仔细看看你的对象模型。在您的测试套件中,如果您注意到所有测试都需要进行大量设置,那么这可能是一个很好的指标,表明您在对象模型中遗漏了一些东西。不过,再一次,一些示例代码会很棒。

于 2009-01-01T18:28:06.753 回答
2
于 2013-04-30T12:57:09.453 回答
0

模块听起来很明智。我不会将方法调用(验证、回调、插件等)提取到模块中,但是,我会将提取限制为我自己的方法。

和往常一样,如果您发布一些示例代码会有所帮助。我发现很难想象清理模型的通用策略,这取决于代码的性质。

于 2009-01-01T11:11:21.487 回答