相对较新的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 => :通过或尝试其他方法,因为他们我的模型设置似乎没有感觉正确存储重复信息在同一个表中。任何建议或赞赏。
答案 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)
以下是您重新考虑的代码:
def underdog
home_team == favorite_team ? visitor_team : home_team
end
祝你好运!