【问题标题】:Ruby on Rails - possible to "group by"?Ruby on Rails - 可以“分组”吗?
【发布时间】:2014-10-08 00:44:27
【问题描述】:

我拥有的是 3 个对象集合和 2 个关联。我的对象是“Owner”、“Jockey”和“Horse”,关联是 OwnerID(Owner)->OwnerID(Jockey) 和 JockeyID(Jockey) -> JockeyID(Horse)。

Owner
Name   **OwnerID**

Jockey
Name   **OwnerID**   *JockeyID*

Horse
Name   OwnerID   *JockeyID*

每个主人可以有很多骑师,每个骑师可以有很多马。 ** 和 * 表示键映射。

所以在我的“所有者”页面上,我想打印所有“马匹”,但根据他们的“骑师”对它们进行分组。我已经像这样打印它们,没有这个分组:

<table>
<tr>
  <th>Name</th>
  <th>JockeyID</th>
</tr>

  <% @subject.FirstAssociation.SecondAssociation.each do |horse| %>
 <tr>
  <td>
    <%= horse['Name'].first %>
  </td>
  <td>
    <%= horse['JockeyID'].first %>
  </td>
  </tr>
   <% end %>

这将简单地打印:

Name   JockeyID
Horse     1
Horsie2   2
Horsie3   3
...

我现在想要的是按骑师分组,而不是打印:

Jockey Name : Mark the Jockey
Name   JockeyID
Horse   1

JockeyName : Fred the Jockey
Name   JockeyID
Horsie2   2
Horsie3   3

etc.

如何做到这一点?

【问题讨论】:

  • 您的关联字段实际上是否称为JockeyIDOwnerID,而不是传统的jockey_idowner_id?并且是 Owner OwnerID 中的主键,而不是传统的 id?这感觉就像作者使用“示例”字段/方法而不是他们的真实代码并最终让所有人感到困惑的问题之一。
  • @MaxWilliams 抱歉,我是 Ruby 新手,所以不知道这些约定。谢谢你让我知道。是的,你在这两种情况下都是正确的。
  • 你能用你的实际代码和关联来编辑和重写你的问题吗?否则会变得非常混乱。
  • 顺便说一句,我不知道您如何在不知道关联字段名称的情况下开始使用 Rails - 这一定是您学习的第一件事!?
  • @MaxWilliams 我的意思是说你是正确的,JockeyID 和 OwnerID 是关联字段, OwnerID 是主键。这是我的实际代码 :) 我多年来一直是 Java 开发人员 - 我真的不需要学习 Ruby,只是为了让代码的这方面工作并继续前进:)。感谢您的帮助

标签: ruby-on-rails ruby ruby-on-rails-3 if-statement ruby-on-rails-3.1


【解决方案1】:

如果您在模型中定义了这样的关联:

/app/models/

Owner
 has_many :jockeys

Jockey
 belongs_to :owner
 has_many :horses

Horse
 belongs_to :owner
 belongs_to :jockey

如果您尝试根据@owner 打印所有骑师名单。你应该这样做:

<% @owner.jockeys.each do |jockey| %>
 <tr>
  <td>Jockey Name </td>
  <td>
    <%= jockey.name %>
  </td>
  <% jockey.horses.each do |horse| %>
    <tr>
      <td>
        Horse Name
      </td>
      <td>
        <%= horse.name %>
      </td>
    </tr>   
<% end %>

当我根据我的假设编写代码时,您可以进行必要的更改。 谢谢

【讨论】:

    【解决方案2】:

    @subject.FirstAssociation.SecondAssociation 令人困惑,所以我将其视为错误并忽略它。

    通常人们会这样做:

    #in controller (show action, eg for url /owners/123)
    @owner = Owner.find_by_id(params[:id], :include => {:jockeys => [:horses]}) 
    #OR, depending on your rails version (the following is newer syntax)
    @owner = Owner.where(:id => params[:id]).includes(jockeys: [:horses]).first
    
    #in view
    #doing one table per jockey here, it's not clear what's required
    <% @owner.jockeys.each do |jockey| %>
      <table>
        <tr>
          <th><%= jockey.name %></th>
          <th><%= jockey.id %></th>
        </tr>
    
        <% jockey.horses.each do |horse| %>
          <tr>
            <td>
              <%= horse.name %>
            </td>
            <td>
              <%= horse.JockeyId %>
            </td>
          </tr>
        <% end %>
      </table>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      相关资源
      最近更新 更多