2012-04-05 6 views
0

beteiligt habe ich diese Modelle bekamGeschwindigkeit erhöhen Rails Ansicht Erstellung, wenn mehrere Tabellen

class PlayersToTeam < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :team 

    accepts_nested_attributes_for :player 
end 

class Player < ActiveRecord::Base 
    has_many :players_to_teams 
    has_many :teams, through: :players_to_teams 
end 

class Team < ActiveRecord::Base 
    has_many :players_to_teams 
    has_many :players, through: :players_to_teams 
    belongs_to :account 
end 

In meiner Show Ansicht für teams zeige ich alle players an diesem team. Der Edit-Link geht tatsächlich die players_to_teams Eintrag zu bearbeiten, also musste ich etwas wie folgt aus:

<% @team.players.each do |player| %> 
    <tr> 
    <td><%= player.FirstName %></td> 
    <td><%= player.LastName %></td> 
    <td><%= link_to "Edit", edit_players_to_team_path(player.players_to_teams.find_by_team_id(@team.id)) %></td> 
    </tr> 

wo @team als Team.find(params[:id]) definiert wurde. Das war SUPER langsam, und wenn man sich die Dev-Logs anschaut, war es, weil die db für jeden Spieler in der edit_players_to_team_path Zeile mehrfach getroffen wurde (um den Spieler zu finden, dann den player_to_team, der den Anforderungen entsprach, vielleicht mehr?) . So

Ich schaltete es stattdessen den players_to team Datensatz verwenden

<% @players_to_teams.each do |ptt| %> 
    <tr> 
    <td><%= ptt.player.FirstName %></td> 
    <td><%= ptt.player.LastName %></td> 
    <td><%= link_to "Edit", edit_players_to_team_path(ptt) %></td> 
    </tr> 
    <% end %> 

wo @players_to_teams-team.players_to_teams in der Steuerung eqaul ist. Dies geht viel schneller, aber scheint immer noch die db für jede Zeile meiner Ansicht zu treffen.

Ich denke Team.find(params[:id]) gibt die players oder players_to_teams Datensätze, die mit dieser team verbunden sind, nicht zurück. Gibt es eine Möglichkeit, dass ich diese Assoziationen einschließen kann, so dass ein Aufruf an Team.find(params[:id]) ein Objekt mit Verweisen auf die player und player_to_teams verknüpften Datensätze zurückgibt, so dass die db nur einmal getroffen wird?

Antwort

0

Beim Abrufen der @player_to_teams- Datensätze laden Sie die Player in dieser Abfrage unter Verwendung von .include(:player) (die tatsächliche Syntax kann je nach der von Ihnen verwendeten Abfrage variieren). Auf diese Weise wird die App 1 Aufruf an die Datenbank machen, um die PTT-Datensätze zu erhalten und möglicherweise einen weiteren Anruf, um alle Spieler zu bekommen. Dadurch vermeiden Sie, dass Sie den Player für jede PTT-Iteration in der Ansicht suchen müssen. Hier ist ein Link, der zeigt - http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

Verwandte Themen