比较属性并分配值

时间:2013-05-11 19:45:34

标签: ruby-on-rails ruby ruby-on-rails-3 model model-associations

这是第一次接近这样的事情,所以我正在寻找一些建议/最佳实践来实现我的目标。我想为用户做出的预测结果分配一个值(得分)。因此,在我的情况下,用户可以对足球场进行预测,如果他们正确猜测,那么他们可以得到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)

我正在收集点点滴滴试图解决这个问题,但不确定是否朝着正确的方向前进

2 个答案:

答案 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告诉我们数组中有多少个对象(在这种情况下,用户做了多少错误的预测),所以从上面012

答案 1 :(得分:1)

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

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

执行此步骤并尝试使其适用于script/rails console中的简单内容。尝试在控制台中创建对象,然后创建关联对象(使用Class.new,其中Class为football_game或Prediction等)。

之后......看看它的外观和思考下一步然后