Ruby on rails 如何组织太胖的Rails模型?
将逻辑从控制器转移到模型中是一种很好的做法。但在任何复杂的系统中,这都会导致一个非常大的文件,即使大多数方法按照Rails的方式是一行程序Ruby on rails 如何组织太胖的Rails模型?,ruby-on-rails,model,Ruby On Rails,Model,将逻辑从控制器转移到模型中是一种很好的做法。但在任何复杂的系统中,这都会导致一个非常大的文件,即使大多数方法按照Rails的方式是一行程序 我已经求助于将模型拆分为其他模块,并将它们包含在原始模型中,例如,model\u标志,model\u验证,等等。有人有更好的方法吗?模块听起来很合理。我不会将方法调用(验证、回调、插件等)提取到模块中,不过,我会将提取限制在我自己的方法中 和往常一样,如果您发布一些示例代码,将会有所帮助。我发现很难想象一个清理模型的通用策略,这取决于代码的性质。出于几个原因
我已经求助于将模型拆分为其他模块,并将它们包含在原始模型中,例如,
model\u标志
,model\u验证
,等等。有人有更好的方法吗?模块听起来很合理。我不会将方法调用(验证、回调、插件等)提取到模块中,不过,我会将提取限制在我自己的方法中
和往常一样,如果您发布一些示例代码,将会有所帮助。我发现很难想象一个清理模型的通用策略,这取决于代码的性质。出于几个原因,我不会这么做 首先,您违反了这样一种假设,即事物将处于它们应该处于的位置,这可能是rails首先获得的最大好处。如果您将模型内容粘贴到模型中,新用户可以很容易地进入您的项目并进行导航。如果你把它拉出来,你只会增加延迟和一些混乱,特别是当移除模块的唯一逻辑是减小模型尺寸时 第二,你几乎什么也得不到,你失去了一些东西。如今,几乎所有的编辑器和IDE都减轻了大文件导航的痛苦,文件大小无关紧要。将内容移动到一个模块实际上会让您和您的同事或未来的维护人员在处理一个模型时跳过多个文件
也就是说,我怀疑铁杆rails最佳实践团队会告诉您的是,如果您的模型如此庞大和复杂,那么您的设计就有缺陷,您的模型可能代表了一些可以制作成单独模型而不是模块的东西 由于不了解对象模型,建议起来有点困难,但我要说的是,如果您确信所有的验证/关联/回调都需要位于该位置,那么仍然有一些方法可以分解常见的行为。因此,虽然我不会将一大块代码从一个文件移到另一个文件中,而只是重新打开类,但我认为使用模块/插件来描述常见的行为类型是一个好主意 例如,如果您正在构建一个Facebook式的活动提要,并且所有内容都需要生成“事件”,那么您可能希望将该“可事件”行为移动到一个模块中,该模块在包含时定义关联/验证等。我想说,该方法实际上会提高代码的清晰度,因为在任何地方手动指定这些关联都不如声明某件事情是可事件的那样有表现力,也不是那么安全(你会在很多地方复制逻辑,当逻辑发生变化时,你知道其余的…)
总之,我要说的是,仔细看看你的对象模型。在您的测试套件中,如果您注意到所有的测试都需要大量的设置,这可能是一个很好的指标,表明您在对象模型中缺少了一些东西。尽管如此,一些示例代码还是很好的。好吧,我不会说你们中的任何人把所有东西都放在一个模型中是错误的,但我认为能够分离各种关注点也是非常有效的。这至少是一种权衡 我正在为我自己的问题发布一个答案,因为我已经找到了Rails实现这一点的方法: 更多信息可在此处找到:
我意识到这是一个相当老的问题,它被标记为已回答,但它仍然有很好的Google juice,所以我认为它值得添加到 Rails 3引入了ActiveSupport::Concern,可用于模块化跨模型共享的行为。或者,就这一点而言,要减肥那些变得太胖的模特 DHH本人在这里提供了一个很好的、简洁的示例要点:
- 您可以使用服务对象:
- 您还可以使用关注点。默认情况下,会在rails 4中为其创建一个文件夹:
ActiveSupport::Concern
用于编写具有可重用代码的模型(许多模型都使用),而模式concert\u
是一种简单的将模型拆分为多个部分的方法。我喜欢第一种方法(因为它指示使用app/而不是lib/),但我不确定该方法是否正确