Я нуб, пытающийся создать свое первое приложение для рельсов. Это «игра со ставками», в которой пользователи пытаются предсказать результаты футбола и получить очки за правильный результат или правильную «тенденцию» (выигрыш, ничья, проигрыш).
Создание и обновление ставок работает нормально, а также создание игр и вставка результатов в качестве администратора. Но у меня проблемы с отображением всех ставок от всех пользователей для каждой игры на своего рода индексной странице, которая должна выглядеть примерно так:
| User1 | User2 | User3 ...
Game Result | Bet | Bet | Bet
Team1 : Team2 1:0 | 1:1 | 3:2 | 1:0
Team3 : Team4 1:2 | 1:2 | -:- | 3:0
Team5 : Team6 -:- | 1:2 | -:- | 3:0
...
Структура моей модели выглядит следующим образом:
class User < ActiveRecord::Base
has_many :bets
class Game < ActiveRecord::Base
has_many :bets
class Bet < ActiveRecord::Base
belongs_to :user, :class_name => 'User', :foreign_key => 'user_id'
belongs_to :game, :class_name => 'Game', :foreign_key => 'game_id'
Обозначенный символом -:- на приведенном выше рисунке, не каждый пользователь будет делать ставки в каждой игре, и не каждая игра будет иметь результат.
Я перепробовал тысячу способов собрать данные для представления индекса и получил проблемы с несколькими ошибками (нулевой объект, отсутствие метода и т. д.). Текущий (не работающий) подход получает все в контроллере:
def index
@users = User.all
@games = Game.all
@bets = Bet.all
end
и в представлении пытаемся перейти к играм и внутри каждой игры через пользователей и ставки в представлении, при этом проверяя, существует ли ставка пользователя и игры, что приводит к нечитаемому грязному коду:
<% @games.each do |game| %>
<tr>
<td><%= game.home_team %> - <%= game.away_team %></td>
<td>
<% if game.away_score.nil? %>
-:-
<% else %>
<%= game.home_score %> : <%= game.away_score %>
<% end -%>
</td>
<% @users.each do |user| %>
<% bet = Bet.where( :user_id => user.id, :game_id => game.id) %>
<% if bet.exists? %>
<td><%= bet.home_bet %> : <%= bet.away_bet %></td>
<% else %>
<td>-:-</td>
<% end -%>
<% end -%>
</tr>
<% end -%>
Я надеюсь, что вы можете предложить более чистый способ сделать это. К сожалению, ни один из десятков прочитанных мной постов не смог решить мою проблему.
Итак, первый вопрос: как лучше всего получить необходимые данные из разных таблиц? Соответствующий второй вопрос: лучше всего построить данные в контроллере и передать их в представление или собрать все вместе в представлении?
Я использую рельсы 3.1.1 с sqlite3. Я надеюсь, что кто-то может помочь этому глупому новичку...
class_name
иforeign_key
в вашем случае не нужны. Они автоматически выводятся из имени ассоциации (belongs_to :game
) и необходимы только в том случае, если имя ассоциации отличается от имени модели или имени ключа. - person Andrew Marshall   schedule 08.02.2012has_many :through
, как вGame has_many Users :through => :bets
. Затем вы можете получить все черезGame.all
(и очистить свои представления, заменив операторы if вызовом модели или помощника, который возвращает правильную вещь) - person Mark Thomas   schedule 08.02.2012