Model view controller Rails将查询从视图移动到控制器

Model view controller Rails将查询从视图移动到控制器,model-view-controller,ruby-on-rails-3,Model View Controller,Ruby On Rails 3,获取视图和控制器的以下代码: # matches/show.html.haml %h3 Players -@clans.each do |clan| %h4=link_to clan.name, clan %ul -@players.find_all_by_clan_id(clan.id).each do |player| %li %strong=link_to player.name, player %h3 -@rounds.each_wi

获取视图和控制器的以下代码:

# matches/show.html.haml
%h3
  Players

-@clans.each do |clan|
  %h4=link_to clan.name, clan
  %ul
    -@players.find_all_by_clan_id(clan.id).each do |player|
      %li
        %strong=link_to player.name, player


%h3
-@rounds.each_with_index do |round,index|
  %h4
    Round
    =index+1

  -@clans.each do |clan|
    %h4=clan.name
    %ul
      -round.participations.includes(:player,:champion).find_all_by_clan_id(clan.id).each do |participation|
        %li
          =participation.player.name
          =participation.champion.name

# matches_controller.rb

class MatchesController < ApplicationController
  def index
    @matches = Match.played.includes(:clans).page(params[:page])

  end

  def show
    @match = Match.includes(:rounds,:clans).find(params[:id])
    @clans = @match.clans
    @rounds = @match.rounds

    @players = @match.players

  end
end
如何将所有不必要的数据库查询、逻辑等从视图移动到控制器?
也许可以简化它?

将其移动到匹配模型,而不是控制器。控制器通常只应包含路由逻辑和设置要在视图中使用的实例变量。大部分代码应该放在模型中。瘦的控制器,胖的模型

仔细阅读范围:

此外,本文来自2006年的pre scopes,但大部分内容仍然与您的问题相关:

你真的不需要为氏族、回合和玩家设置实例变量。在迭代关联集合的简单情况下,可以直接从@match访问这些内容。例如:

-@match.clans.each do |clan|
否则,如果某个范围比简单范围更复杂,则使用该范围