示例:当使用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中使用,还是模型发送回哑列表并让控制器操纵这些?”。