Skip to content

Latest commit

 

History

History
37 lines (29 loc) · 1.26 KB

specify-new-attributes-for-find-or-create-by.md

File metadata and controls

37 lines (29 loc) · 1.26 KB

Specify New Attributes For #find_or_create_by

The ActiveRecord #find_or_create_by method is a handy way to get an object that represents a record. It will attempt to look up that record, usually based on a unique value or set of values. If it can find one, then that's the record you get. If nothing is found, then it will create a new record.

New records tend to need more data than just the unique lookup attribute. There are a couple ways these other attributes can be specified.

The first is by giving #find_or_create_by a block.

User.find_or_create_by(email: "[email protected]") do |new_user|
  new_user.admin = false
  new_user.password = params[:password]
  new_user.password_confirm = params[:password_confirm]
end

Another approach is to precede the #find_or_create_by call with a #create_with call.

User.create_with(
  admin: false,
  password: params[:password],
  password_confirm: params[:password_confirm]
).find_or_create_by(email: "[email protected]")

In both cases, the extra attributes will not be applied to the User record in the case of a find; they are only used in the case of a create.