1

这是第一次接近这样的事情,所以我正在寻找一些建议/最佳实践来实现我的目标。我想为用户做出的预测结果分配一个值(分数)。所以在我的情况下,用户可以对足球赛程进行预测,如果他们猜对了,那么他们可以说是 3 分。

到目前为止我有

class Fixture < ActiveRecord::Base
  attr_accessible :home_team, :away_team, :fixture_date, :kickoff_time, :prediction_id

  has_many :predictions
end

class Prediction < ActiveRecord::Base
  attr_accessible :home_team, :away_team, :home_score, :away_score, :fixture_date, :fixture_id, :user_id

 has_many :fixtures
end

class Result < ActiveRecord::Base
  attr_accessible :home_team, :away_team, :score, :fixture_date
end

class User < ActiveRecord::Base
  attr_accessible :prediction_id

has_many :predictions
end

class Point < ActiveRecord::Base
  attr_accessible :result_id, :score, :user_id, :prediction_id
end

所以我目前的想法是我可以在 Point 模型中进行一些比较,因为我可以访问预测和结果?也许是一个 case 语句,以便当预测和结果匹配时分配值 3。然后我可以将该值保存到 Point 模型。

我在想的第二个选项是更新 Point 模型的 rake 任务

我现在可以看到的一个问题是预测分数是使用单独的值分配的,即 home_score 和 away_score 作为整数,结果分数存储为一个字符串,即 2-2。这由我抓取的方式控制数据。

有更多经验的人将如何处理这个?,希望在这里学习一些东西。

任何建议表示赞赏

谢谢

编辑

我想出了这个,虽然可能非常错误,这就是我如何看待逻辑?

def points_total
  points = case 
  when predition.home_score && prediction.away_score == result.home_score && result.away_score
    self.score = 3
  when prediction.home_score == result.home_score || prediction.away_score == result.away_score
    self.score = 1
  when prediction.home_score != result.home_score && prediction.away_score != result.away_scor
    self.score = 0
  end
end

def allocate_points
  points_total
  Point.create!(points: score)

end

关于将分数字符串分成两个整数,可以这样做

left, right =  "4x3".split("x").map(&:to_i)

所以在我的情况下会是

home_result, away_result = Result.score.split("x").map(&:to_i)

我收集点点滴滴试图弄清楚这一点,但甚至不确定是否朝着正确的方向前进

4

2 回答 2

1

看到 home_team、 away_team 和 fixture_date 在 Fixture、Prediction 和 Result 表中重复出现,我的建议是:

  • 创建一个具有这三个属性的“football_game”
  • 根据需要为其创建其他属性,例如分数
  • 使用对 football_match 实例(行)的引用创建其他模型,例如 Prediction football_match_id。我远离“匹配”,因为这是一个通用术语,在 ruby​​ 中,您可以执行“gfgfgffg.match(“g”)。本身不是保留字,但我会避免。命名非常重要。

执行此步骤并尝试使其适用于script/rails console. 尝试在控制台中创建对象,然后创建关联对象(都使用Class.newwhere Class is football_game 或 Prediction 等)

在那之后......看看它的外观并考虑下一步

于 2013-05-12T01:48:30.963 回答
1

阅读您的问题时,我想到了这一点,假设Prediction模型中有以下内容:

def points_total
  wrong_predictions = [home_score - result.home_score, away_score - home.away_score]
  wrong_predictions = wrong_predictions.reject { |i| i == 0 }.size # returns 0, 1 or 2
  case wrong_predictions
  when 0 then 3
  when 1 then 1
  else 0
  end
end

这是一个更短的例子,虽然可能不太可读:

def wrong_predictions
  [home_score - result.home_score, away_score - home.away_score].reject { |i| i == 0 }.size
end

def points_total
  [3,1,0][wrong_predictions]
end

但是,我不确定预测如何与结果相关联。

保存点时,您应该将它们与某些东西相关联。此外,您必须将score其用作属性,因为这是您在 points 表中拥有的列,而不是points.

def allocate_points
  points.create!(score: points_total)
  # or create_point(...) or whatever
end

更新:方法解释

方法的第一部分

[home_score - result.home_score, away_score - home.away_score]

从用户的预测结果中减去真实结果,因此如果他预测正确,则加起来为 0,否则为正整数或负整数。因此,如果他都猜对了,那么数组将是[0, 0],如果他错过了 2 个点,那么类似的东西[0, 2],或者两者都错了[-1, 1]

接下来我们从 数组中删除所有零reject { |i| i == 0 },所以前面的数组看起来像[],[2][-1, 1]

调用size数组告诉我们数组中有多少对象(在这种情况下,用户做出了多少错误的预测),所以从上面0,12.

于 2013-05-12T01:35:55.810 回答