Передача дополнительных данных в find_or_create

Что-то, о чем я всегда думал о рельсах, - это возможность передавать дополнительные данные методам find_or_create в рельсах. Например, я не могу сделать следующее

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

Я мог бы сделать

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

Но это уродливое, а также требует три запроса. Я полагаю, я мог бы сделать

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

Но это означает, что я знаю, что значения email, legs и face. Кто-нибудь знает, есть ли действительно элегантный способ сделать это?

Ответы

Ответ 1

Попробуйте следующее:

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

Когда у вас есть дополнительные параметры для find_or_create_by_, вы должны передать все параметры как хэш.

Рельсы 4

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

Ответ 2

С рельсами 4.x

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

Используйте этот

User.find_or_create_by(first_name: 'Scarlett') do |user|
  user.last_name = 'Johansson'
end