这是第一次接近这样的事情,所以我正在寻找一些建议/最佳实践来实现我的目标。我想为用户做出的预测结果分配一个值(得分)。因此,在我的情况下,用户可以对足球场进行预测,如果他们正确猜测,那么他们可以得到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)
我正在收集点点滴滴试图解决这个问题,但不确定是否朝着正确的方向前进
答案 0 :(得分: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
。
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
,1
和2
。
答案 1 :(得分:1)
看到home_team,away_team和fixture_date在Fixture,Prediction和Result表中重复,我的建议是:
football_match_id
创建其他模型,例如预测,并引用football_match实例(行)。我远离'匹配',因为这是一个通用的术语,在红宝石中,你可以做“gfgfgffg.match(”g“)。本身不是保留字,但我会避免。命名非常重要。执行此步骤并尝试使其适用于script/rails console
中的简单内容。尝试在控制台中创建对象,然后创建关联对象(使用Class.new
,其中Class为football_game或Prediction等)。
之后......看看它的外观和思考下一步然后