2013-02-13 2 views
1

У меня есть проблема, которую я решил определенным образом, что не удовлетворяет.Рельсы от двух до многих отношений

У меня есть игровая модель, и в игре всегда присутствуют две команды, которые являются частью модели команды. Я ссылаюсь на эти команды командой ids team1_id и team2_id. Из моих взглядов всякий раз, когда я хочу вытащить всю запись команды, мне приходится каждый раз находить находку.

Мне было интересно, есть ли способ ссылаться на эти две команды, не переходя между многими или многими отношениями, или это единственный способ? Это было бы почти 2-много отношений, я знаю, что этого не существует, но я хотел бы знать, как лучше всего решить такие проблемы.

Спасибо,

Это снимок моих миграций:

create_table :games do |t| 
    t.datetime "time" 
    t.integer "team1_id" 
    t.integer "team2_id" 


create_table :teams do |t| 
    t.references :city 
    t.references :user 
    t.string "name", :default => "", :null => false 
+0

Это иногда лучше думать эти вещи через модель, а не только таблицы. Опубликуйте свои модели ... –

+0

У меня нет никакой связи в моих моделях между командами и играми. Если у меня должна быть связь, что это должно быть? принадлежит_to: игра дважды? Я не думаю, что это сработает. –

+0

Да, лучше сделать соединение в своих моделях. Но я думаю, что уже есть ответ, отвезти вас туда. –

ответ

3

Путь вы его установка правильный путь. На модели игры делают две ссылки команды, team1 и team2

class Game 
    belongs_to :team1, class_name: 'Team' 
    belongs_to :team2, class_name: 'Team' 
end 

Тогда вы можете просто позвонить team1 team2 на экземпляре игры, и он будет тянуть команду для вас.

game = Game.first 
game.team1 
game.team2 

Или вы можете опустить TEAM1 и team2 идентификаторы из модели игры и создавать таблицы объединения с играми и командами, вы бы просто назвать «game.teams»

+0

Ой, что работает? Разве Rails понимают 1 и 2? Я попробую. –

+0

Нет, что не срабатывало так, как я ожидал: NoMethodError: undefined method 'team1 ' –

+0

похоже, что вы либо опечатали что-то, либо не перезагрузили модель после внесения изменений. – cpuguy83