Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing extra data to find_or_create

Something I've always wondered about rails is the ability to pass extra data to find_or_create methods in rails. For example, I can't do the following

User.find_or_create_by_name('ceilingfish', :email => '[email protected]', :legs => true, :face => false)

I could do

u = User.find_or_create_by_name('ceilingfish')
u.update_attributes(:email => '[email protected]', :legs => true, :face => false)

But that's uglier, and also requires three queries. I suppose I could do

User.find_or_create_by_name_and_email_and_face_and_legs('ceilingfish','[email protected]',true, false)

But that kind of implies that I know what the values of email, legs and face are. Does anyone know if there's a really elegant way of doing this?

like image 475
Ceilingfish Avatar asked Mar 06 '10 23:03

Ceilingfish


2 Answers

Try this:

User.find_or_create_by_name(:name=>'ceilingfish', 
        :email => '[email protected]', :legs => true, :face => false)

When you have additional parameters to find_or_create_by_, you have to pass all the parameters as a hash.

Rails 4

  User.create_with(
    email: '[email protected]', 
    legs: true, face:false
  ).find_or_create_by(:name=>'ceilingfish')
like image 56
Harish Shetty Avatar answered Nov 18 '22 00:11

Harish Shetty


With rails 4.x

DEPRECATION WARNING: This dynamic method is deprecated. Please use e.g. Post.find_or_create_by(name: 'foo') instead

Use this

User.find_or_create_by(first_name: 'Scarlett') do |user|
  user.last_name = 'Johansson'
end
like image 1
Philip Avatar answered Nov 18 '22 01:11

Philip