Передача дополнительных данных в 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