Zapytanie do bazy danych, bez powtarzania tego samego id

Witam.
Głowię się jak dać zapytanie, aby w tabeli we frontend podał w jednej linii wartości z kilku id’kow.

- @results.each do |result|
  %tr.item{"data-item-id" => result.id, "data-id" => result.id, :id => "tr_#{result.id}"}
    - if @project.players.find(result.player_id).presence
      %td= @project.players.find(result.player_id).fullname
      - @project.results.where(:player_id => result.player_id).each do |playerresult| # <- problem, bo działa, lecz kod powyżej znowu powtórzy operacje, bo nie uwzględni, że player_id o takim id już został narysowany w tabeli
        %td
          = best_in_place [@project, playerresult], :result, :type => :input
          = best_in_place [@project, playerresult], :resultok, :type => :checkbox

Tabela:

id, player_id, result, resultok
1,    12,      110,     t
2,    12,      120,     f
3,    12,      125,     t

Problem polega na tym, że gdy tabela zostanie narysowana, to zgodnie z oczekiwaniami poda mi 3 linie w tabeli. Ja chcę natomiast, aby z takiej bazy danych narysowało mi dla player_id=12, w jednej linii te trzy wartości, ale żeby w pętli @results.each nie powtarzało dla kolejnych, które już zostały uprzednio narysowane. Da radę to jakoś optymalnie zrobić ? Mam nadzieję, że za bardzo nie pokręciłem.
Z góry dziękuję za pomoc i pozdrawiam :slight_smile:

Chcesz pogrupować dane po player_id, problemem jest jedynie wybór funkcji agregującej dla pozostałych kolumn.
Jeśli interesują Cię wszystkie wartości (a nie np max, min, bool_or dla danej kolumny), to raczej nie obędzie się bez hackowania. Jeśli używasz postgresa (>9.3), to prawdopodobnie dałoby się te wartości przepchnąć jsonem. Jeśli mysql, to chyba tylko rzutowanie na stringi i konkatenacja jakimś sensownym delimiterem.

Czyli najlepiej zostaje parsowanie przez JS’a?

Problem rozwiązałem. Railsy zrobiły to w bardzo ładny sposób :smiley: <3 (grupowanie danych poprzez kolumnę player_id):

- @results.all.group_by(&:player_id).each do |player, scores|
  %tr.item{"data-item-id" => player, "data-id" => player, :id => "tr_#{player}"}
    - if @project.players.find(player).presence
      %td= @project.players.find(player).fullname
      - scores.each do |result|
        %td
          = best_in_place [@project, result], :result, :type => :input
          = best_in_place [@project, result], :resultok, :type => :checkbox

Jeśli masz jeszcze chwilkę, to spróbuj zmienić swój kod w ten sposób, byś mógł w widoku napisać coś takiego:

- @results.each do |player, scores|
  %tr.item{"data-item-id" => player, "data-id" => player, :id => "tr_#{player}"}
     %td= player.fullname
     - scores.each do |result|
       %td
         = best_in_place [@project, result], :result, :type => :input
         = best_in_place [@project, result], :resultok, :type => :checkbox

Dobrą zasadą jest, by widoki były głupie, tutaj masz bardzo stary, ale wciąż aktualny artykuł http://www.rubyfleebie.com/rails-consider-the-view-as-stupid/

Jeśli masz problemy, to daj znać, na pewno pomożemy.

Dziękuję za wskazówkę. Na pewno postaram się zrefaktoryzować tak kod :slight_smile: