使用其ID显示属性值

时间:2014-04-16 13:10:19

标签: ruby-on-rails ruby ruby-on-rails-4 associations

在我的应用程序中,我通过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列

中的值

3 个答案:

答案 0 :(得分: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,如果您仍然需要它,但我只是认为您更愿意直接按名称分组。我只是添加了一个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

在控制器中以正确的顺序加载使视图更简单。对于锦标赛的名称,只需使用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 %>