我有一个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关联的控制器?
答案 0 :(得分:1)
您可以尝试通过数据库迁移分别将匹配模型中的foreign_key从player1, player2
更改为player1_id, player2_id
。因为你的foreign_key和belongs_to关联是一样的吗?请告诉我它是否有效!