2014-04-16 53 views
1

在我的應用程序中,我使用ID將對象分組。目前,我只能顯示ID,但我想顯示屬性值。使用ID顯示屬性值

A夾具belongs_to錦標賽和錦標賽has_many賽程。

控制器

def index 
    @fixtures = Fixture.all 
    @tournament_fixture = @fixtures.group_by {|f| f.tournament_id} 
end 

查看

<% @tournament_fixture.sort.each do |tourn_name, fixture| %> 
    <%= tourn_name %> 
     <% fixture.each do |f| %> 
      <td><%= f.home_team %></td> 
      <td><%= f.away_team %></td> 
      <td><%= f.kickoff_time %></td> 
     </tr> 
     <% end %> 
<% end %> 

我怎樣才能得到

<%= tourn_name %> 

顯示它對應的值,在其:name column

在我看來,那一刻例如我得到這個返回

<tbody> 
     2 
     <tr> 
      <td>Tournament Name</td> 
      <td>Team 1</td> 
      <td>Team 2</td> 
      <td>2000-01-01 14:00:00 UTC</td> 
      <td><a class="btn btn-success" href="/fixtures/1">view</a></td> 
     </tr> 
     </tbody> 

的2只需要在該值:名稱列

回答

1

我建議由tournament分組,而不是:

@tournament_fixture = @fixtures.group_by(&:tournament) 

然後重複使用:

<% @tournament_fixture.sort.each do |tournament, fixture| %> 
    <%= tournament.name %> 
    ... 
<% end %> 
1

您可以訪問整個對象很像,你可以得到像這樣的ID:

def index 
    @fixtures = Fixture.includes(:tournaments).all 
    @tournament_fixture = @fixtures.group_by {|f| f.tournament.name} 
end 

id仍可作爲要麼f.tournament_idf.tournament.id,如果您還需要過b我只是覺得你寧願直接按名字分組。我只是添加了一個includes語句,以便一次性將所引用的錦標賽對象加載到您的燈具中。否則,只有當您逐一訪問它們時,Rails纔會加載比賽。

作爲替代方案,你可以加載錦標賽,包括所有的燈具,而不是和迭代的比賽是這樣的:

控制器

def index 
    @tournaments = Tournament.includes(:fixtures).all 
end 

查看

<% @tournaments.each do |tournament| %> 
    <%= tournament.name %> 
    <% tournament.fixtures.each do |f| %> 
     <td><%= f.home_team %></td> 
     <td><%= f.away_team %></td> 
     <td><%= f.kickoff_time %></td> 
    </tr> 
    <% end %> 
<% end %> 

對我來說這似乎更自然,你不需要它在所有裝置上進行遊戲,以便通過錦標賽來映射它們。

+0

好吧我看到你現在說什麼,事實上我只是想通了,我可以在控制器中做到這一點..... tournament_fixture = fixtures.group_by {| f | f.tournament.name},但這是不好的做法? – Richlewis

+0

如果你在你的燈具中使用'include',我猜想沒問題 - 否則Rails會用一個語句加載每個燈具的錦標賽。根據燈具的數量,雖然可能需要(短)。請記住,當你的控制器方法變得更大時。 – KappaNossi

0

您可以按照正確的順序加載裝置。沒有必要在記憶中分組。請記住包含tournaments以避免N+1查詢。

# controller 
def index 
    @fixtures = Fixture.order(:tournament_id).includes(:tournaments).all 
end 

在控制器中以正確的順序加載使視圖更簡單。比賽的名字只需使用FixtureTournament之間的關聯。

# view 
<% @fixtures.each do |fixture| %> 
    <tr> 
    <td><%= fixture.tournament.name %></td> 
    <td><%= fixture.home_team %></td> 
    <td><%= fixture.away_team %></td> 
    <td><%= fixture.kickoff_time %></td> 
    </tr> 
<% end %>