【问题标题】:Show attribute value using its id使用其 id 显示属性值
【发布时间】:2014-04-16 13:10:18
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我建议改为按tournament 分组:

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

    然后迭代使用:

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

    【讨论】:

      【解决方案2】:

      您可以像这样获取 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 语句来一次性加载引用的Tournament 对象和您的灯具。否则,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 %>
      

      对我来说这似乎更自然一些,您无需遍历所有赛程来按比赛映射它们。

      【讨论】:

      • 好吧,我明白你现在在说什么了,事实上我刚刚发现我可以在控制器中做到这一点..... f.tournament.name},但这是一种不好的做法吗?
      • 如果你在你的灯具中使用include,我猜没关系——否则Rails 会用一个语句为每个灯具加载锦标赛。根据灯具的数量,它可能需要(短)一段时间。当你的控制器方法变得更大时,请记住这一点。
      【解决方案3】:

      您可以按正确的顺序加载灯具。没有必要在内存中分组。请记住包含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 %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-03
        • 2019-02-28
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        相关资源
        最近更新 更多