Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何组织太胖的Rails模型?_Ruby On Rails_Model - Fatal编程技术网

Ruby on rails 如何组织太胖的Rails模型?

Ruby on rails 如何组织太胖的Rails模型?,ruby-on-rails,model,Ruby On Rails,Model,将逻辑从控制器转移到模型中是一种很好的做法。但在任何复杂的系统中,这都会导致一个非常大的文件,即使大多数方法按照Rails的方式是一行程序 我已经求助于将模型拆分为其他模块,并将它们包含在原始模型中,例如,model\u标志,model\u验证,等等。有人有更好的方法吗?模块听起来很合理。我不会将方法调用(验证、回调、插件等)提取到模块中,不过,我会将提取限制在我自己的方法中 和往常一样,如果您发布一些示例代码,将会有所帮助。我发现很难想象一个清理模型的通用策略,这取决于代码的性质。出于几个原因

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


我已经求助于将模型拆分为其他模块,并将它们包含在原始模型中,例如,
model\u标志
model\u验证
,等等。有人有更好的方法吗?

模块听起来很合理。我不会将方法调用(验证、回调、插件等)提取到模块中,不过,我会将提取限制在我自己的方法中


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

出于几个原因,我不会这么做

首先,您违反了这样一种假设,即事物将处于它们应该处于的位置,这可能是rails首先获得的最大好处。如果您将模型内容粘贴到模型中,新用户可以很容易地进入您的项目并进行导航。如果你把它拉出来,你只会增加延迟和一些混乱,特别是当移除模块的唯一逻辑是减小模型尺寸时

第二,你几乎什么也得不到,你失去了一些东西。如今,几乎所有的编辑器和IDE都减轻了大文件导航的痛苦,文件大小无关紧要。将内容移动到一个模块实际上会让您和您的同事或未来的维护人员在处理一个模型时跳过多个文件


也就是说,我怀疑铁杆rails最佳实践团队会告诉您的是,如果您的模型如此庞大和复杂,那么您的设计就有缺陷,您的模型可能代表了一些可以制作成单独模型而不是模块的东西

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

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


总之,我要说的是,仔细看看你的对象模型。在您的测试套件中,如果您注意到所有的测试都需要大量的设置,这可能是一个很好的指标,表明您在对象模型中缺少了一些东西。尽管如此,一些示例代码还是很好的。

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

我正在为我自己的问题发布一个答案,因为我已经找到了Rails实现这一点的方法:

更多信息可在此处找到:

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

Rails 3引入了ActiveSupport::Concern,可用于模块化跨模型共享的行为。或者,就这一点而言,要减肥那些变得太胖的模特

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

  • 您可以使用服务对象:
  • 您还可以使用关注点。默认情况下,会在rails 4中为其创建一个文件夹:

嗯,就是这样;我真的没有策略。目前,我只是简单地将方法从一个文件转储到另一个文件,这感觉不太像rails,这就是为什么我来这里了解最佳实践是什么。Cheers=)Rails中的大多数行为都找不到“它们应该在哪里”。另外,通过将模块包含到主模型文件中,您已经告诉了其他人在哪里可以查看。我同意导航大文件并没有那么困难,但是如何分割模型呢?什么样的方法先开始?我不会把我的模型分开。我在按功能和字母顺序组织它们之间摇摆不定,但我并不太担心。我同意中岛的观点,你应该尽可能地退出共享和可重用的功能,但更多的是为了简洁和良好的设计,而不是长度。正如我在对自己答案的评论中所指出的,我认为这是一个正确的观点,尤其是最后一段。当涉及到物体设计时,没有任何东西是现成的。经常质疑你的设计并做出最好的判断。评估你的设计(最后一段)的一个非常简单的方法是通读你的代码,看看是否有名词经常出现。有时候,如果你有几个方法引用同一个名词,它表示一个想要创建的对象/类。我从Red Dot Ruby会议上了解到了这一点(我相信是从Gregg Polack学到的),所以是的,我相信继续下去,这是一个更好的方法,它与rails核心配合得很好(关于这个问题,不是答案)最后变得令人困惑。
ActiveSupport::Concern
用于编写具有可重用代码的模型(许多模型都使用),而模式
concert\u
是一种简单的将模型拆分为多个部分的方法。我喜欢第一种方法(因为它指示使用app/而不是lib/),但我不确定该方法是否正确