2016-05-30 7 views
1

私のジョインテーブルの1つ、私はドロップダウンメニューの選択に基づいて結果をフィルタリングしたいと思います。さらに説明する前に、関連するコードを提供します。ジョイン・テーブルの要素をドロップダウン・メニューで絞り込みます。 (Rails 4)

私は、問題の3つのモデルがあります:

class Scoreboard 
    has_many :teams, has_many :team_matches 
end 

class Team 
    belongs_to Scoreboard 

    #self reference with the teams to create team_matches. 
    has_many :first_team, class_name: "TeamMatch", foreign_key: "team_a_id", dependent: :destroy 
    has_many :team_a, through: :first_team, source: :team_a 

    has_many :second_team, class_name: "TeamMatch", foreign_key: "team_b_id", dependent: :destroy 
    has_many :team_b, through: :second_teams, source: :team_b 
end 

とチームのテーブルを結合です最終モデル:

class Team_Match 
    belongs_to :team_a, class_name: "Team" 
    belongs_to :team_b, class_name: "Team" 
    belongs_to :scoreboard 
end 

チームは、インデックス表示のためのコントローラーコードと一致します:

class TeamMatchesController < ApplicationController 
    require 'will_paginate/array' 

    def index 
     @selected = true 
     @scoreboard = Scoreboard.find(params[:scoreboard_id]) 
     @teams = @scoreboard.teams 
     @matches = @scoreboard.team_matches.order("match_date DESC").paginate(page: params[:page], per_page: 5) 
    end 
end 

インデックスページビュー:

<h2 class="team-matches-header">TEAM MATCHES</h2> 

<% if manager_or_owner?(@scoreboard, current_user) %> 
    <%= link_to "Add Matches", new_scoreboard_team_match_path(@scoreboard), class: "btn btn-primary" %> 

    <%= link_to "Clear Matches", deletematches_scoreboard_path(@scoreboard),method: :delete, class: "btn btn-danger", :data => {:confirm => "Are you absolutely sure you want to delete all matches?"} %> 
<% end %> 

<%= form_tag(scoreboard_team_matches_path, :method => "get", id: "match-search-form", autocomplete: "off") do %> 
    <div class="row new-member-field"> 
     <div class="col-xs-12 col-sm-6"> 
      <%= select_tag "teams", options_from_collection_for_select(@teams, "id", "name"), prompt: "Select something", class:"form-control" %> 
      <%= submit_tag 'Filter' %> 
     </div> 
    </div> 
<% end %> 

<div class="match-list"> 
    <%= render 'match_list' %> 
</div> 

一致リストの一部

<% if @matches.present? %> 
    <% @matches.each do |game| %> 
     <div class="row match-div clearfix" id="match_<%= game.id %>"> 
       <div class="col-xs-12 match-column"> 
         <div class="facing-teams"> 
          <div class="first-team"> 
           <%= game.team_a.name %> 
          </div> 
          <div class="second-team"> 
           <%= game.team_b.name %> 
          </div> 
         </div> 
       </div> 
     </div> 
    <% end %> 
<% end %> 



<div class="row"> 
    <div class="col-xs-12 new-member-pages"> 
     <%= will_paginate @matches %> 
    </div> 
</div> 

これまでのところ、チームはインデックスページと一致した上で、私はドロップダウンメニューの選択を置くことができましたチームのリスト私が抱えている問題は、それを機能的にする方法です。ドロップダウン選択からチームを提出すると、:team_a_idまたは:team_b_idが選択されたチームのIDと一致するMatchオブジェクト(@matches)のリストを表示したいと思います。それをどうやってやりますか?

答えて

1

私はあなたが望むことを達成するためにscopesを使用します。スコープは再利用可能なフィルタで、アソシエーションに適用して、必要なレコードを正確に見つけることができます。

これは、あなたが特定のチームの試合を見つけスコープを作成する方法を次のとおりです。

class Team_Match 
    scope :has_team, ->(team_id) { 
    team_a = arel_table[:team_a_id].eq(team_id) 
    team_b = arel_table[:team_b_id].eq(team_id) 
    team_a_or_b = team_a.or(team_b) 

    where(team_a_or_b) 
    } 
end 

これはARELを使用しています(ActiveRecordのは、SQLクエリを作成するためにボンネットの下に使用する)に一致するものを見つけるためにteam_a_idまたはteam_b_id列のいずれかです。上記のコードで何が起こっているのか分からない場合は、Mastering AR and Arelにすばやく移動して速度を上げてください。

あなたはこのようにスコープを使用する:あなたはまた、Team_Matchに参加するすべての関係にスコープを使用することができます

matches = Team_Match.has_team(team_id) 

matches = @scoreboard.team_matches.has_team(team_id) 

スコープも一緒に連鎖することができます。

matches = @scoreboard.team_matches.has_team(team_id).where(match_date: today) 

スコープを使用すると、チームIDを選択ボックスからfiに渡すことができますND試合:

def index 
    @selected = true 
    @scoreboard = Scoreboard.find(params[:scoreboard_id]) 
    @teams = @scoreboard.teams 
    @matches = @scoreboard.team_matches.order("match_date DESC") 
    @matches = @matches.paginate(page: params[:page], per_page: 5) 

    # we apply the scope (if present) to only show the matches for the selected team 
    if (team_id = params[:selected_team_id]) 
    @matches = @matches.has_team(team_id) 
    end 

end 

あなたは上記のコードを作成する必要があります唯一の変更は、実際の名前は、選択したチームIDを保持するのparam変数である何かを取り組んでいます。

+1

これは素晴らしいです。ありがとう。 – kpaul

関連する問題