Как я могу объединить только одну запись в has_many с критериями в Rails? - PullRequest
0 голосов
/ 21 ноября 2018

Если у меня есть следующие модели, как я могу вернуть все отчеты, созданные пользователем, но только отчет с «самой высокой оценкой» на игрока?

class Player < ApplicationRecord
  has_many :reports
end

class Report < ApplicationRecord
  belongs_to :author
  belongs_to :grade
  belongs_to :player
end

class Grade < ApplciationRecord
  has_many :reports
end

class Author < ApplicationRecord
  has_many :reports
end

Пример данных:

/Player/    -    /Author/   -    /Report Grade/
John Smith        -    David      -        5
John Smith        -    David      -        4
Thomas Li         -    David      -        5
Mike Lee          -    Sean       -        9
Mike Lee          -    Sean       -        2
Arnold Jackson    -    Sean       -        5
Cathleen Miller   -    Sean       -        7

Результат Мне бы хотелось:

/Player/    -    /Author/   -    /Report Grade/
John Smith        -    David      -        5
Thomas Li         -    David      -        5
Mike Lee          -    Sean       -        9
Arnold Jackson    -    Sean       -        5
Cathleen Miller   -    Sean       -        7

В настоящее время я использую следующее:

Report.joins(:player).where(type: %w(spring fall))

Я не уверен, как отфильтровать записи с более низкими оценками.Если мне нужно добавить больше информации, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 22 ноября 2018

На Postgres вы можете использовать DISTINCT ON:

class Report < ApplicationRecord
  belongs_to :player
  belongs_to :grade
  belongs_to :author

  def self.highest_graded
    Report.select(%q{
      DISTINCT ON(reports.player_id, reports.author_id)
      grades.grade AS max_grade,
      players.name AS player_name,
      authors.name AS author_name,
      reports.*
    }).joins(:player, :grade, :author)
      .order('reports.player_id, reports.author_id, grades.grade DESC')
  end
end

<table>
  <thead>
    <tr>
      <th>id</th>
      <th>Player</th>
      <th>Author</th>
      <th>Grade</th>
    </tr>
  </thead>
  <tbody>
    <% Report.highest_grade.each do |report| %>
    <tr>
      <td><%= report.id %></td>
      <td><%= report.player_name %></td>
      <td><%= report.author_name %></td>
      <td><%= report.max_grade %></td>
    </tr>
    <% end %>
  </tbody>
</table>

id  Player          Author  Grade
1   John Smith      David   5
3   Thomas Li       David   5
4   Mike Lee        Sean    9
6   Arnold Jackson  Sean    5
7   Cathleen Miller Sean    7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...