我在试图找出关联/加入我的表'团队'和'时间表'的最佳方法时遇到了麻烦。我的模特是:
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'的数据。
联接表是否是更好的解决方案?如果是这样,你会怎么做?任何帮助将不胜感激!
答案 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
来处理所有内部事务。