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

时间:2011-03-27 20:52:53

标签: 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_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

如何将所有不必要的数据库查询,逻辑等从视图移动到控制器? 也许以某种方式简化这个?

1 个答案:

答案 0 :(得分:0)

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

阅读范围:
http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

此外,本文来自2006年(前置范围),但大多数仍与您的问题相关:
http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

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

-@match.clans.each do |clan|

否则,如果范围比简单的has_many / belongs_to关联更复杂,请使用范围。