首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型关联(Rails 5 API)

模型关联(Rails 5 API)
EN

Code Review用户
提问于 2018-04-12 00:08:05
回答 1查看 186关注 0票数 4

我有一个Character模型,它有一个CharClassClassPerks子模型。

目前,我通过手动分配数据来复制我的逻辑。

我的Character索引和创建:

代码语言:javascript
复制
def index

    @campaign = Campaign.find_by_id(params[:campaign_id])
    @characters = @campaign.characters
    render json: {
        characters: @characters
    }
end

def create
    @campaign = Campaign.find_by_id(params[:campaign_id])
    @charClass = CharClass.find_by_id(params[:character_char_class_id])
    @character = @campaign.characters.new(character_params)
    @character.char_class_id = params[:character_char_class_id]

    if @character.save!
        render status: 201, json: {

            message: "Successfull added this character to the campaign!",
            character_name: @character.character_name + ' the ' + @charClass.class_name,
            character_class: @charClass.class_name,
            character_level: @character.character_level,
            character_experience: @character.character_experience,
            character_gold: @character.character_gold,
            character_perks: get_names(@character.character_perks),
            character_image: @character.character_image

        }
    else
        render status: 404, json: {
            message: "Something went wrong: Check line 24 of the Character Controller"
        }
    end
end

我正在手动分配character_classcharacter_image,尽管这两者基于它们的character_class总是相同的。

character.rb内部,我这样做是为了在创建后分配给他们:

代码语言:javascript
复制
    after_create :add_perks, :save_class

    def add_perks
        self.class_perks.each do |perk|
            self.character_perks.create(class_perk_id: perk.id)
        end
    end


    def save_class()
        case self.char_class_id
            when 1 # Mindthief
                self.character_image = "https://gloomhavenil.files.wordpress.com/2017/12/11849117_616974988445216_217288420_n.jpg?w=480"
                self.character_class = "Mindthief"
                self.save
            when 2 # Tinkerer
                self.character_image = "http://www.cephalofair.com/wp-content/uploads/2015/04/Quatryl-Tinkerer.jpg"
                self.character_class = "Tinkerer"
                self.save
            # when 'Sawbones'
            # else
        end
    end
end

它正在起作用,但我不知道如何更好地/适当地做这件事。我删除了无用的字段,但你会看到,下面,我已经建立了适当的关系。

代码语言:javascript
复制
  create_table "char_classes", force: :cascade do |t|
    t.string "class_name"
    t.string "class_image"
    t.string "class_perks"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

 create_table "characters", force: :cascade do |t|
    t.string "character_class"
    t.string "character_image"
    t.integer "char_class_id"
    t.index ["campaign_id"], name: "index_characters_on_campaign_id"
    t.index ["char_class_id"], name: "index_characters_on_char_class_id"
  end

我可以做Character.first.char_class.class_name,我会得到适当的结果;所以我又回到假设我遵循的方法是非常不正确的。

EN

回答 1

Code Review用户

发布于 2018-04-12 04:00:20

您需要使用ActiveModelSerializers (AMS)来基于类的实例序列化您的json响应。

代码语言:javascript
复制
class CampaignsController < ApplicationController
  def index
    render json: { characters: campaign.characters }
  end

  def create
    @character = campaign.characters.new(character_params.merge(char_class_id: char_class.id))

    if @character.save!
        render json: @character, serializer: CharacterSerializer, status: 201 # This should automatically be formatted by AMS
    else
        not_found('Something went wrong: Check line 24 of the Character Controller')
    end
  end

  private

  def campaign
    @campaign ||= Campaign.find_by_id(params[:campaign_id])
  end

  def char_class
    @charClass ||= CharClass.find_by_id(params[:character_char_class_id])
  end
end

字符类的AMS类应该是这样的

代码语言:javascript
复制
class CharacterSerializer < ActiveModel::Serializer
  attributes :message, :character_name, :character_class, :character_level, :character_experience, :character_gold, :character_perks, :character_image

  def message
    'Successfull added this character to the campaign!'
  end

  def character_name
    return object.character_name + ' the ' + character_class # check the associations
  end

  def character_class
    object.charClass.class_name
  end

  def character_perks
    # Unsure what this get names methods does so im leaving it for you to refactor
    get_names(object.character_perks),
  end

end

还将此添加到您的ApplicationController中

代码语言:javascript
复制
class ApplicationController < ActionController::Base

  # Add this to your application controller

  def not_found(message = nil)
    render json: { message }, status: 404
  end

end

我将根据您的信息更新重构的模型类。希望这能帮上忙。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/191831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档