Rails: Using build with a has_one association in rails Rails: Using build with a has_one association in rails ruby-on-rails ruby-on-rails

Rails: Using build with a has_one association in rails


The build method signature is different for has_one and has_many associations.

class User < ActiveRecord::Base  has_one :profile  has_many :messagesend

The build syntax for has_many association:

user.messages.build

The build syntax for has_one association:

user.build_profile  # this will workuser.profile.build  # this will throw error

Read the has_one association documentation for more details.


Take a good look at the error message. It is telling you that you do not have required column user_id in the profile table. Setting the relationships in the model is only part of the answer.

You also need to create a migration that adds the user_id column to the profile table. Rails expects this to be there and if it is not you cannot access the profile.

For more information please take a look at this link:

Association Basics


Depending on the use case, it can be convenient to wrap the method and automatically build the association when not found.

old_profile = instance_method(:profile)define_method(:profile) do  old_profile.bind(self).call || build_profileend

now calling the #profile method will either return the associated profile or build a new instance.

source:When monkey patching a method, can you call the overridden method from the new implementation?