在我的应用程序中,我通过ID对对象进行分组。目前,我只能显示ID,但我想显示属性值。
比赛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需要是:name列
中的值答案 0 :(得分:1)
你可以像访问这样的id那样访问整个对象:
def index
@fixtures = Fixture.includes(:tournaments).all
@tournament_fixture = @fixtures.group_by {|f| f.tournament.name}
end
id
仍然可用f.tournament_id
或f.tournament.id
,如果您仍然需要它,但我只是认为您更愿意直接按名称分组。我只是添加了一个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 %>
对我而言,这似乎更自然一点,你不需要遍历所有赛程来映射他们的锦标赛。
答案 1 :(得分:1)
我建议改为tournament
分组:
@tournament_fixture = @fixtures.group_by(&:tournament)
然后使用:
进行迭代<% @tournament_fixture.sort.each do |tournament, fixture| %>
<%= tournament.name %>
...
<% end %>
答案 2 :(得分:0)
您可以按正确的顺序加载灯具。没有必要在内存中进行分组。请务必加入tournaments
以避免N+1
次查询。
# controller
def index
@fixtures = Fixture.order(:tournament_id).includes(:tournaments).all
end
在控制器中以正确的顺序加载使视图更简单。对于锦标赛的名称,只需使用Fixture
和Tournament
之间的关联。
# 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 %>