【问题标题】:Comparing attributes and assign a value比较属性并赋值
【发布时间】:2013-05-11 19:45:34
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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来看。

    【讨论】:

    • 感谢您的解释,但我不确定 wrong_predictions 方法在做什么?你能详细说明一下吗?
    • 谢谢,所以为了确保我理解正确,积分模型仍然保留分配的积分。计算分配多少积分的逻辑在预测模型中完成。关于显示用户通过预测获得的积分会有_many积分吗?
    • 是的,我想创建一个Prediction has_one :point 关联是有意义的(我猜每个预测都是针对单个游戏的,所以只有一个结果)。您可以将该代码放在 Point 模型中,这取决于您要如何调用它。我不确定哪种方式更“正确”。
    • 如果有多个用户进行预测,我应该使用 Prediction has_many :points
    • 如果用户有很多预测,则不会。那么如果一个用户有 5 个预测,他可以得到 5 分。每个用户都有自己的预测,对吧?
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的解释,请您介意详细说明一下,努力让我明白这一点..S
    • 我推荐一种敏捷方法。首先在控制台中使其正常工作(我稍微扩展了答案),然后解决之后的后续步骤。首先是拥有不重复所有这些领域的模型。完整的解决方案将需要一些工作,并且每个阶段可能需要几个 SO 问题。慢慢来以获得更好的结果:)
    • 是的,这是非常深入的,所以一次一步走绝对是个好主意,而且通过分阶段进行,我希望能学到更多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2013-02-09
    • 2011-03-04
    相关资源
    最近更新 更多