在MVC中,哪个层应该负责为某些上下文或视图构建Things列表?

时间:2014-11-07 08:48:37

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

示例:当使用kaminari或任何其他使用范围的“分页”机制时,您可以在模型上调用该范围。

SongsController < ApplicationController
  def index
    @songs = Song.most_popular_with_covers.page(params[:page]).per(10)
  end
end

我试图找出这是否是正确的地方。在纯MVC中,我希望模型层可以处理这些调用(如限制,订单等)。用恕我直言的坏例子说明:

SongsController < ApplicationController
  def index
    @songs = Song.order_by(:listen_count, :desc).includes(:albums => :covers).page(params[:page]).per(10)
  end
end

我现在把关于“流行度”如何计算到我的控制器中的知识,我的控制器需要知道如何获取封面图像,它需要知道歌曲,封面和图像是如何连接的等等。所以,一路走到另一边(瘦的控制器):

@songs = Song.paged_most_popular_with_covers(params[:page])

然而,很快就会变成模型上的方法(脂肪模型)。让我们说一些上下文需要他们分页,但只能获得前5名,例如对于侧栏小部件:

Song.paged_most_popular_with_covers(page: 1, per: 5) #or
Song.paged_top_five_with_covers #or
Song.paged_top_with_covers(amount: 5)

您也可以将此行为扩展到其他概念:获取选择字段的资源列表(以不同方式排序,不分页,仅pluck名称和ID等),获取资源列表侧边栏小部件(仅需要标题和ID,有序和限制不同)等等。

在这种情况下,问题变得更加广泛:“模型是否应该关注发送回列表,准备在视图V的上下文C中使用,还是模型发送回哑列表并让控制器操纵这些?”。

0 个答案:

没有答案