首页 > 解决方案 > Ruby on Rails JSON 到模型转换

问题描述

 def create
      @match_data = JSON.parse(request.raw_post)

      @match = @match_data["match"]

      match = Match.new
      match.match_length = @match["match_length"]
      match.quest = @match["quest"]
      match.humans_team_stats = @match["humans_team_stats"]
      match.supernaturals_team_stats = @match["supernaturals_team_stats"]
      @match_data["users_match_stats"].each do |user|
        user_account = User.find user["id"]
        match.users << user_account
        match.save!

        user_match_stats = UserMatchStat.new
        user_match_stats.user = user_account
        user_match_stats.match = match
        user_match_stats.kills = user["kills"]
        user_match_stats.deaths = user["deaths"]
        user_match_stats.assists = user["assists"]
        user_match_stats.damage_dealt = user["damage_dealt"]
        user_match_stats.damage_taken = user["damage_taken"]
        user_match_stats.first_blood = user["first_blood"]

        user_match_stats.save!

        match.user_match_stats << user_match_stats

      end

      render json: @match_data
    end

这真的是将传入的 json 对象映射到 rails 模型并为其记录的最佳方法吗?一定有比这更好的方法...

标签: ruby-on-railsjsonruby

解决方案


如果您的模型的列与 JSON 对象中的键相同(看起来它们来自您的代码片段),您可以使用symbolize_keys将 json 对象转换为您的 rails 模型将接受作为提交参数的 ruby​​ 哈希。它可能如下所示:

match = Match.create(match_length: @match["match_length"], quest: @match["quest"], humans_team_stats: @match["humans_team_stats"], supernaturals_team_stats: @match["supernaturals_team_stats"])

@match_data["users_match_stats"].each do |user|
        user_account = User.find user["id"]
        match.users << user_account
        UserMatchStat.create(user.symbolize_keys)
end

推荐阅读