复合键或连接表

时间:2013-05-30 04:48:20

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我在试图找出关联/加入我的表'团队'和'时间表'的最佳方法时遇到了麻烦。我的模特是:

class Team < ActiveRecord::Base
  attr_accessible :city, :conf, :div, :key, :name
  self.primary_key = "key" #Abbreviations for strings 'CHI', 'TB', 'SEA' etc.

  has_many :schedules, foreign_key: [:away_team, :home_team]
end

class Schedule < ActiveRecord::Base
  attr_accessible :away_team, :date, :home_team, :season, :week, :team_key
  self.primary_keys = :away_team, :home_team #Abbreviations for strings 'CHI', 'TB', 'SEA' etc.

  belongs_to :team, primary_key: "key"
end

我安装了gem“composite_primary_keys”,“〜&gt; 5.0.13”。

在我指定变量

时在rails控制台中
>> team = Team.find("SEA")

SELECT "teams".* FROM "teams" WHERE "teams"."key" = ? LIMIT 1  [["key", "SEA"]]
=> #<Team key: "SEA", city: "Seattle", name: "Seahawks", conf: "NFC", div: "West">

它完美地显示了西雅图,但是当我跑步时:

>> team.schedules

SELECT "schedules".* FROM "schedules" WHERE ("schedules"."away_team" = 'SEA' AND "schedules"."home_team" IS NULL) 
=> []

'schedule'表中包含home_team列中'SEA'的数据。

联接表是否是更好的解决方案?如果是这样,你会怎么做?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

首先:如果你不需要,请不要使用复合键(在这种情况下你不要) 主键用于访问单个项目,而不是用于约束或业务逻辑 在您的情况下,主索引不能用于通过home_team选择计划。

同样最好尽可能使用Rails约定。它让生活更轻松。 使用id作为主键并连接表。

我发现您的日程安排属于两个团队,团队有两种日程安排(家庭和远程)。所以你的模型看起来像:

class Team < ActiveRecord::Base
  attr_accessible :city, :conf, :div, :key, :name

  has_many :home_schedules, class_name: 'Schedule', foreign_key: :home_team_id
  has_many :away_schedules, class_name: 'Schedule', foreign_key: :away_team_id

  def schedules
    home_schedules + away_schedules
  end
end

class Schedule < ActiveRecord::Base
  attr_accessible :away_team, :date, :home_team, :season, :week, :team_key

  belongs_to :home_team, class_name: 'Team'
  belongs_to :away_team, class_name: 'Team'
end

然后

team = Team.find_by_key('SEA')
team.schedules

已添加

我会用

生成模型
rails g model Team city conf div short_cut name
rails g model Schedule day:date season week:integer home_team_id:integer away_team_id:integer

通过将team_id添加到Fan,您可以将球队与粉丝联系起来。你总是可以使用团队的short_cut(因为我命名你以前的关键属性)来显示或选择团队,但让Rails使用id来处理所有内部事务。