【问题标题】:Ruby on Rails JSON to Model ConversionRuby on Rails JSON 到模型转换
【发布时间】:2020-06-10 18:48:57
【问题描述】:
 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-rails json ruby


    【解决方案1】:

    如果您的模型的列与 JSON 对象中的键相同(看起来它们来自您的代码 sn-p),您可以使用 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
    

    【讨论】:

    • 嘿,你对这个想法有什么看法。而不是将我的用户匹配统计信息存储在单独的表中,然后为其创建一个连接表。您如何看待仅将比赛统计信息存储为单个 json 列?例如,当传递我的请求时,我会存储主要匹配信息,然后将其余信息放入单个 json 列中?这样做有什么好处和坏处?
    • 如果您使用ActiveModel::AssignmentActiveModel::ModelActiveRecord::Base 使用),则输入是否具有字符串或符号键无关紧要,因为它们用于调用setter 方法。
    • 将它存储在 JSON 列中的缺点是,您无法获得使用模式强类型化数据的任何好处,也无法获得使用单独模型来封装逻辑和 ActiveRecord 关系的好处。你只是有一个无类型的混乱,那就是要查询的 PITA。
    • 优点是JSON列可以用来存储不规则的数据,没有固定的schema,可以存储原始的JSON响应。
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多