通过Rails 5 API创建/更新资源并进行关联

时间:2016-05-27 07:06:16

标签: ruby-on-rails rails-activerecord rails-api

我有一个Match模型,其中包含2个玩家字段,这些字段与用户模型具有belongs_to关联

模型

class Match < ApplicationRecord

  belongs_to :player1, :class_name => 'User', :foreign_key => 'player1'
  belongs_to :player2, :class_name => 'User', :foreign_key => 'player2'

end

通过API创建匹配(使用Postman POST请求)时,我尝试传递播放器的user_id,但得到了一个TypeMismatch错误,指示控制器需要一个User对象,但得到了一个Fixnum。

看看这一行:

@match = Match.new(match_params)

错误是有道理的,所以我将默认的脚手架生成的控制器修改为这样:

def create
  @match = Match.new
  @match.player1 = User.find(params[:match][:player1])
  @match.player2 = User.find(params[:match][:player2])

  if @match.save
    render json: @match, status: :created, location: @match
  else
    render json: @match.errors, status: :unprocessable_entity
  end
end

# PATCH/PUT /matches/1
def update
  if @match.update( :player1 => User.find(params[:match][:player1]),
                    :player2 => User.find(params[:match][:player2])
                    )

    render json: @match
  else
    render json: @match.errors, status: :unprocessable_entity
  end
end

它有效,但解决方案似乎“不优雅”。 有没有更好的方法将值传递给具有belongs_to关联的控制器?

1 个答案:

答案 0 :(得分:1)

您可以尝试通过数据库迁移分别将匹配模型中的foreign_key从player1, player2更改为player1_id, player2_id。因为你的foreign_key和belongs_to关联是一样的吗?请告诉我它是否有效!