我有一个使用 MVC 构建的应用程序,它生成一个视图,该视图提供跨多个模型的摘要信息。除此之外,一些计算是在不同的数据集上执行的。

没有明确的单一模型(至少映射到一个表)作为起点似乎有意义,因此从控制器中的贡献模型中提取各种摘要,传递到视图中并在那里执行计算。

但这似乎,嗯, 肮脏的. 。但控制器应该是轻量级的,不是吗?业务逻辑不应该出现在视图中,因为我已经拥有它了。

那么这些信息应该在哪里收集呢?一个新模型,没有映射到表格?库函数/模块?或者是其他东西?

(虽然我认为这主要是一个架构/模式问题,但我在 Rails 工作,FWIW。)

编辑:各方面的答案都很好,达成了很多共识,这令人放心。我“接受”了我所做的将 Railscasts 链接保留在顶部的答案。我在 Railscast 观看方面落后了 - 我将努力纠正这一点!

有帮助吗?

解决方案

正如布莱恩所说,您可以创建另一个模型来整理需要完成的工作。有 很棒的 Railscast 关于如何做这类事情。

华泰

其他提示

控制器不必映射到特定的模型或视图。您的模型不必一对一映射到数据库表。这就是框架的想法。分离所有可以单独测试的关注点。

为什么不创建一个不继承的模型 ActiveRecord::Base 并在那里执行逻辑(想想敏捷中的 Cart 类...With Rails)。

控制器不一定是 轻的。

但是,如果您有一些仅依赖于模型的计算,那么您可能只需要某种模型包装器来让模型执行计算。然后,您可以将其放入视图的 API 中,以便视图获得最终结果。

您不希望逻辑出现在视图中。但是您可以自由创建数据库视图。只不过,不是在数据库端创建它,而是将其创建为新模型。这将使您能够在一个地方执行计算和实际逻辑。试图让你的观点与别人的观点保持同步是很痛苦的。创建新模型的一次性“痛苦”......我投票支持新模型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top