我应该从MVC应用程序中的Views迭代业务对象吗?

时间:2009-04-10 18:59:49

标签: ruby-on-rails ruby model-view-controller

我想知道在使用MVC框架时我应该在View中进行多少数据访问。 例如:在我的应用程序中,有一个页面显示所有我最喜欢的艺术家的列表,并且对于每个艺术家,列出该艺术家的所有歌曲。 问题是:我应该只将艺术家列表传递给视图,还是应该传递所有数据(艺术家+歌曲)?

Ps:我正在使用Ruby On Rails和ActiveRecord。

2 个答案:

答案 0 :(得分:3)

不要在视图中提取数据 - 这是控制器的工作。在视图中,您应该只引用控制器方法加载的数据。

在您的情况下,这意味着使用:include创建艺术家列表,以便预先加载歌曲。

# In your controller
@artists = Artist.find(:all, :include => :songs)

编辑为了回应方法的评论,从视图中提取数据存在两个问题:

  • 关注点分离。这就是我所说的当我说“应该”只在控制器中提取数据时 - 在MVC中,控制器处理数据访问,理论上,视图不包含逻辑。有时在视图中放置一些数据检索肯定会更容易,但它很快就会变得难看。
  • 效率,无论是查询数量还是查询结果大小,我认为这是方法所讨论的。如果你在一个页面中加载足够的数据,这就成了一个问题,我想知道这是不是暗示了一些重构(或者至少是分页)。

答案 1 :(得分:2)

假设Artist的模型类有提供歌曲集合的方法,我认为没有理由要求控制器明确地将两者都传递给视图。