Semantyka oby wywołań jest inna - Game#next_player bazuje na active_player, a Player#next w ogóle nie bierze tego pod uwagę. Zostawiłbym oba, a w Game#next_player odwołał się do Player#next.
Widzę tu jednak zasadniczy błąd - pozycja zawodnika powinna być zupełnie niezależna od jego id.
Jasne, powinno być find_by_position. Do tego modulo. Ale pisałem to na sucho, chodziło o ideę Może to faktycznie trochę niefortunny przykład, ale czasami są takie sytuacje, gdzie metoda działa na dwóch powiązanych obiektach i nie bardzo wiadomo gdzie pasuje lepiej.
Może to powinna być metoda osobnego modelu nie dziedziczącego z AR::Base.
[code]class Gameplay
def initialize(current_player, game) # a może (players, game)
end
def next_player
end
end[/code]
Jednak moim zdaniem bardziej pasuje to do Gry. Jeśli grasz w jakąś grę (szachy, monopoly, pokera) to raczej nie jest właściowością gracza wiedzieć kto jest następnym graczem. Raczej jest to właściwość gry (jest jakiś zbiór graczy, którzy grają w takim a takim momencie, wg takiego a takiego algorytmu). Szczególnie wydaje mi się to widoczne w grach, w któryc kierunek grania może się zmieniać na skutek jakiegoś posunięcia gracza np. makao.
Zauważ, że naturalnym jest dla gry, że zna swoich graczy i aktualnego gracza (jej stan) a mniej naturalnym jest ta znajomość z punktu widzenia gracza samego w sobie. On by mógł pewnie grać i działać nawet nie wiedząc często ilu jest uczestników.