存储重复信息Active Record Model或只使用has_many:through?

时间:2012-06-11 03:43:01

标签: ruby-on-rails database-design activerecord

相对较新的rails,我正在为一些朋友制作一个简单的rails应用程序,以阻止nfl游戏。

我正在创建一个活跃的记录模型来模拟有关体育游戏的信息,例如主队,访客,start_time等,以及与该游戏(最喜欢的,失败者,总数等)相关的信息。 / p>

这感觉很尴尬,因为这些领域中的几个我基本上都存储了重复的信息(例如,一个团队总是要么是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 => :通过或尝试其他方法,因为他们我的模型设置似乎没有感觉正确存储重复信息在同一个表中。任何建议或赞赏。

2 个答案:

答案 0 :(得分:1)

这对我来说很好看。一般来说,你应该避免使用has-many-through关系,因为它们既麻烦又复杂,而且往往是不必要的。

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

我还要重构原始方法:

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

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

另外,您应该看一下at this article何时在模型方法中使用self

答案 1 :(得分:1)

  1. 首先,查找数据库规范化。
  2. 除非您正在处理其他并发症,否则不要存储派生/隐含字段。例如。有时你这样做是为了提高绩效,但你了解下行/风险。在这种情况下,(a)如果您了解主队,您可以派出访客。 (b)同样,如果你知道最爱,你可以得出失败者。 (我不知道这条线,但如果它包含了团队的信息,那么你可以从那里获得最爱和失败者。)
  3. 以下是您重新考虑的代码:

    def underdog
      home_team == favorite_team ? visitor_team : home_team
    end
    
    祝你好运!