2014-04-11 61 views
1

我试图将团队和他们的匹配存储在数据库中。有几支球队和几场比赛。每场比赛都由两支球队打球。哪种类型的关联?

这是我的MySQL方案。

CREATE TABLE teams (
    id INT(11) NOT NULL auto_increment, 
    name VARCHAR(255) NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY (name) 
); 

CREATE TABLE matches (
    id INT(11) NOT NULL auto_increment, 
    datetime datetime NULL, 
    team_home INT(11) NOT NULL, 
    team_guest INT(11) NOT NULL, 
    result_home INT(11) NOT NULL, 
    guest_home INT(11) NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (team_home) REFERENCES teams (id), 
    FOREIGN KEY (team_guest) REFERENCES teams (id) 
); 

现在我想在Rails中构建这些方案,但我不知道选择正确的关联。我如何做两个领域的引用(在我的例子team_home和team_guest团队)?

+0

Rails拥有自己的能力阅读http://guides.rubyonrails.org/migrations.html#schema-dumping-and-you了解更多.. –

回答

1

像@Sumit Munot说你应该通过引导,很多很好的信息有

作为练习尝试使用一些Rails生成的看到铁轨是如何喜欢的东西命名

rails generate model Team name:string 
rails generate model Match start_at:datetime team_home_id:integer team_away_id:integer score_home_team:integer score_away_team:integer 

然后查看和修改db/migrations加入null: false需要

注创建的文件:我改变了一些列名略有

一旦你的迁徙拨打创建使用rake db:migrate

然后修改app/models中生成的模型数据库表,并添加关系

class Team 
    has_many :home_matches, class_name: "Match", foreign_key: "team_home_id" 
    has_many :away_matches, class_name: "Match", foreign_key: "team_away_id" 

    def matches 
    (home_matches + away_matches).flatten.sort_by(:start_at) 
    end 
end 

class Match 
    belongs_to :home_team, class_name: "Match", foreign_key: "team_home_id" 
    belongs_to :away_team, class_name: "Match", foreign_key: "team_away_id" 
end 

正常关联不需要如此复杂,可以说你有即

rails generate model Player name:string team_id:integer 

class Player 
    belongs_to :team 
end 

class Team 
    has_many :players 
end 

一个球员的典范,只要players表中有一栏team_id它只会“工作”

+0

这就是答案 –

+0

Thanks @ house9!这是否意味着我必须在我的数据库中手动添加team_home_id和team_away_id的外键?我尝试使用Team.new(name:'Teamname')'在rails控制台中创建一个团队,然后我得到了'ArgumentError:Unknown key:foreign_key_id' ... – ggn

+0

我的坏 - 它应该是'foreign_key',而不是' foreign_key_id' - 现在更新帖子 – house9