0

Rails 相对较新,我正在为几个朋友开发一个简单的 Rails 应用程序来限制 nfl 游戏。

我正在创建一个活动记录模型,该模型对体育比赛的信息进行建模,例如主队、访客、开始时间等,以及与该比赛的障碍相关的信息(最喜欢的、失败的、总的等)。

这感觉很尴尬,因为对于其中几个字段,我基本上存储了重复的信息(例如,一个团队始终要么是 home_team 要么是访客,并且始终要么是最喜欢的要么是失败者)

所以,我的模型看起来像这样:

create_table "games", :force => true do |t|
    t.integer  "week"
    t.string   "home_team"
    t.string   "visitor_team"
    t.string   "favorite"
    t.decimal  "line"
    t.decimal  "total"
    t.string   "kickoff"
    t.string   "status"   #['open', 'completed']
    t.datetime "created_at",   :null => false
    t.datetime "updated_at",   :null => false
end

为了使模型尽可能简洁,我只定义了必填字段(主队、访客和最喜欢的字段),然后我在我的游戏模型中编写了一些简单的方法来返回有关比赛的其他有用信息,例如,而不是列出每个在模型中组队两次(一次为失败者/最爱和主场/客场)

def underdog
    teams = [self.home_team, self.visitor_team]
    teams.each do |team|
        return team if team != self.favorite
    end
end

这行得通,但我在争论是否更有意义为游戏信息创建一个单独的模型(并使游戏模型本身保持最小)并仅使用 has_many => :through 或尝试其他方法,因为它们让我拥有我的模型设置似乎感觉不正确将重复信息存储在同一个表中。任何建议或赞赏。

4

2 回答 2

1
  1. 对于初学者,请查找数据库规范化。
  2. 不要存储派生/隐含字段,除非您这样做是为了处理其他复杂情况。例如。有时您这样做是为了提高性能,但您了解缺点/风险。在这种情况下,(a) 如果你知道主队,你可以推导出客队。(b) 同样,如果你知道最喜欢的人,你可以推导出失败者。(我不知道这条线,但如果它包含关于球队的信息,那么你可以从那里得到最爱和失败者)。

这是您重构的代码:

def underdog
  home_team == favorite_team ? visitor_team : home_team
end

祝你好运!

于 2012-06-11T04:04:53.323 回答
1

这对我来说看起来不错。一般来说,你应该避免使用 has-many-through 关系,因为它们很混乱和复杂,而且通常是不必要的。

不过,在这种情况下,我实际上建议创建一个Team模型。由于是 NFL,因此这些球队永远不会改变,但将其拉出可以减少您需要填写数据库的字符串数量。

我还将重构原始方法:

def underdog
    if home_team == favorite_team
        home_team
    else
        visitor_team
    end
end

在 Ruby 中,您不需要显式调用return,因为方法中的最后一条语句是隐式返回的。此外,在 Ruby 中以这种方式使用循环将被认为是错误的形式。

此外,您应该看看这篇关于何时self在模型方法中使用的文章。

于 2012-06-11T03:55:33.160 回答