webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

1対1のアソシエーションでエラーが出る

railsで1対1の関係があるモデルを作ったときに、よく分からないエラーではまったのでメモです。

以下のようなモデルを想定します。

class User < ActiveRecord::Base
  has_one :bank_information
  accepts_nested_attributes_for :bank_information, allow_destroy: true
end

class BankInformation < ActiveRecord::Base
  belongs_to :user
end

DBに保存されているuserインスタンスへ新しくbank_informationインスタンスを関連付けるには、以下のようにします

@user = User.find(params[:id])
@user.build_bank_information

ですが、あるとき次のようなエラーが出ました

ActiveRecord::StatementInvalid: Mysql2::Error: Column 'user_id' cannot be null: UPDATE `bank_informations` SET `user_id` = NULL, `updated_at` = '2017-08-22 14:15:42' WHERE `bank_informations`.`id` = 1

原因は、すでに@userにbank_informationが紐づいていたからでした。

そこで、次のようにチェックを入れるとOKです。

@user = User.find(params[:id])
@user.build_bank_information unless @user.bank_information