【问题标题】:Saving player statistics (different for each game) to database in Rails将玩家统计数据(每个游戏不同)保存到 Rails 中的数据库
【发布时间】:2016-07-14 18:43:27
【问题描述】:

我可能找不到任何关于此的内容,因为我不知道如何描述它。

我有以下设置:

  • 用户帐户可以有一个包含基本信息(姓名、年龄)的个人资料(可选),也可以有一个没有关联帐户的个人资料。
  • 一个配置文件可以链接到多个游戏配置文件(每个游戏一个)
  • 游戏配置文件有一个游戏内名称,应该是我可以找到玩家统计信息的地方。

现在,对于不同的游戏,有不同的统计数据。我真的需要为每个游戏创建另一个具有相关属性的模型,还是有更聪明的方法来做到这一点?

【问题讨论】:

    标签: ruby-on-rails activerecord devise


    【解决方案1】:

    @Okomikeruko 对不同属性描述的不同游戏统计数据提出了很好的观点。尽管hash in string 方法会使查询和索引此表变得复杂,但应该警告您。

    另一种方法是使用两张表来保存游戏统计数据,一张是header 表,带有游戏会话日期、持续时间等属性,另一张是detail 表,用于保存游戏特定属性:

    # pseudocode:
    
    GameProfile
      has_many :game_profile_details
    end
    
    GameProfileDetail
      belongs_to :game_profile
    
      stat_name: string
      stat_value: string
    end
    

    【讨论】:

    • 我想我更喜欢你的实现,因为它更像“Rails”。我应该明确指出,我指的是电子游戏中的游戏,或者是运动的同义词。所以我会将 GameStats 添加到每个游戏中,然后从 GameProfileDetail 中引用 GameStat - 但这无疑为我指明了正确的方向,非常感谢!
    【解决方案2】:

    您可以创建一个通用模型来保存给定游戏的统计信息。

    由于每场比赛都有一些相同的统计数据(名字?,高分?),您可以轻松设置这些数据。

    棘手的部分是如何处理不同的游戏统计数据。一款游戏可能有“最佳时间”,而另一款游戏则“使用过”。

    要处理这个问题,您可以将其他数据保存为字符串中的哈希。

    所以它会在一个游戏中保存meta_data: "{'best_time' => '0:04:23.6', 'other' => 'thing'}",但您不需要为不使用该字段的游戏留空best_time 字段。

    然后当你加载数据时,根据游戏,你可以编码

    <%= @gamedata.meta_data.best_time %>
    # returns "0:04:23.6"
    

    【讨论】:

    • 很好的解决方案,但我将使用 Nic Nilov 的修改版本。不过谢谢!
    • 同意。我在另一个项目中做了类似于@Nic_Nilov 的解决方案。我的建议基于我最近使用 Stripe 的 API 的经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2023-03-22
    • 2011-03-12
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多