Zliczanie rekordów

Chcę stworzyć tabelę wyników ile razy user dobrze wytypował.

[code=ruby]<% @bets.each do |bet| %>

<%=h bet.user.username %> <%=h bet.user.matches.count %> <% end %>[/code] ten kod wyświetla mi taki rezultat:

Użytkownik/ Ilośc typowań/ Ilosc trafień
tpl / 7
ktos/ 1
tpl/ 7
tpl/ 7

występujący na tej liście 3 x tpl to właśnie 3 razy dobrze trafiony wynik przez usera tpl. Jak to zrobić, żeby zliczyć do kupy tego usera by ten wynik wyświetlić w kolumnie Ilosc trafien ?

przy czym @bets:

named_scope :trafione_zaklady, :joins => :match, :conditions => [ 'preresult = matches.result' ] @bets = Bet.trafione_zaklady.find(:all)

moze by tak group_by <- tak to z SQL. Dodaj grupowanie do zapytania np.

 @bets = Bet.trafione_zaklady.find(:all, :group => "user_id")

to rozwiązało mi sprawę duplikowania userów przy wyświetlaniu, ale dalej nie wiem jak zliczyć tych samych.
Jak znowuż robie:

[code=ruby] @ilość = Bet.trafione_zaklady.find(:all, :group => “user_id”)
i

<%=h @ilość.size %>[/code] to mi zlicza userów tych co zostali czyli dwóch, a nie ilość tych, którzy byli grupowani.

nie dałeś zliczania w zapytaniu!

@bets = Bet.trafione_zaklady.find(:all, :select => "user_id, COUNT(user_id)" :group => "user_id")

to da ci w polu count ilość trafień np:

c = Comment.all(:select => ‘who, COUNT(who)’, :group => ‘who’)
±-------------±------+
| who | count |
±-------------±------+
| hakko | 10 |
| Legionsmoka | 3 |
| Kalina | 1 |
| kobretti | 1 |
| gotar | 3 |
| Weronika1996 | 3 |
| Weronika | 1 |
| kudlacz135 | 1 |
| storm | 30 |
±-------------±------+
9 rows in set

Railsy railsami, ale surowa wiedza z SQL się przydaje, no przynajmniej na razie, póki NoSql rozwiązania dopiero się rozwijają. A w niektórych zastosowaniach będą pewnie jeszcze bardzo długo, więc warto byś siadł i pouczył się SQL bez niego będziesz często jakieś problemy spotykał dość trywialne.

@gotar dzięki

ostatecznie działa:

@bets = Bet.trafione_zaklady.find(:all, :select => 'bets.user_id, COUNT(bets.user_id) AS trafienia', :group => 'bets.user_id', :order => 'trafienia DESC')

mam:

named_scope :trafione_zaklady, :joins => :match, :conditions => [ 'preresult = matches.result' ] @bets = Bet.trafione_zaklady.find(:all, :select => 'bets.user_id, COUNT(bets.user_id) AS trafienia', :group => 'bets.user_id', :order => 'trafienia DESC')
i wyświetlam to:

<% @bets.each do |bet| %> <tr> <td><%=h bet.user.username %></td> <td><%=h bet.user.matches.count %></td> <td><%=h bet.trafienia %></td> </tr> <% end %>
Mam asocjacje:

[code=ruby]class Match < ActiveRecord::Base
belongs_to :round
end

class Round < ActiveRecord::Base
has_many :matches
end

class Bet < ActiveRecord::Base
belongs_to :match
belongs_to :user
end

class User < ActiveRecord::Base
belongs_to :match
has_many :bets
has_many :matches, :through => :bets
end[/code]
nie mam asocjacji pomiędzy round i bet

chciałbym teraz wyświetlić ilość trafień w rundzie przez usera.

jest to w ogóle możliwe ?, bo jakbym nie zmieniał named scopa dodając round poprzez joins czy include to ciąg jest błąd że nie mam asocjacji pomiędzy round i bet.

Wszystko jest możliwe, no prawie to kwestia zapytania SQL i tyle. Musisz pomyśleć tylko jaka część łączy to wszystko.

Jak nie dasz rady to daj znać to ci się pomoże bardziej.

Np.

Ilość trafień w meczu usera. Jako wynik masz Tablice z id powiedzmy meczy.

Runda ma wiele meczy.

No i Szukasz, to tylko kwestia zapytania.

normalnie przy wyświetlaniu to robię tak:

<% bet.match.round.name %> #czy nawet <% bet.match.round.season.name %>
i asocjacje działają,
tylko w tym przypadku przez pewnie named scopa już te asocjacje nie działają i nie mogę się dostać do round, żeby w jakikolwiek sposób to użyć.

no to zrób to na 2 razy. Czyli znajdz wszystkie bet.match.round oraz wszystkie trafione_zakłady i zrób złączenie (część wspólną dla nich wyświetl)

chciałbym powiedzieć, że wiem jak tego dokonać - no, ale nie wiem :frowning:

Czego nie wiesz? Ja zrobic te dwa zapytania? To chyba wiesz bo masz już je gdzieś w aplikacji na pewno używane. Czyli ze cześć wspolna?

Jak nie wiesz jaka metoda wbudowana to robi to zawsze mozna sobie napisac

no to
a = tablica id’ów nr 1
b = tablica id’ów nr 2

a.each do |x|
c << x if b.include?(x)
end

c.uniq! - czesc wspolna

pomijając że i tak nie wiem jakie zapytanie zrobić dla bet.match.round to na jakiś prostych przykładach próbuje użyć uniq!,
ale to co mi wybierze to jak mogę to przeiterować, żeby wyświetlić to co zostało wybrane ?

@gotar

część wspólną dwóch tablic dużo łatwiej uzyskać:

irb(main):020:0> a = [1,2,3,4,5] => [1, 2, 3, 4, 5] irb(main):021:0> b = [3,3,4,5,6,7] => [3, 3, 4, 5, 6, 7] irb(main):022:0> a & b => [3, 4, 5]

czy na forum jest opcja ignorowania użytkowników ? bo odnoszę wrażenie, że moje posty tylko @gotar widzi :frowning:

wiem wiem, że łatwiej ale jak napisałem, jak nie wiesz jak sobie poradzić, nie znasz gotowych funkcji itp to zrób to łopatologicznie tak na chłopski rozum, napisz to.

No ale tu znowu mój sposób udzielania odpowiedzi, wskazywać drogę a nie rozwiązanie zadziałał ;]

PS

a co do tego ze mało kto udziela odpowiedzi, to bardziej chodzi o to ze albo rozwiazania sa latwe i ktorys raz tego samego sie nie chce mowic, albo temat, dane, kod ktory wklejasz rozlekly i nie chce sie w to wglebiac.