我一直想知道的关于rails的东西是能够将额外的数据传递给rails中的find_or_create方法。例如,我不能做以下
User.find_or_create_by_name('ceilingfish', :email => 'an_email@a.domain', :legs => true, :face => false)
我能做到
u = User.find_or_create_by_name('ceilingfish')
u.update_attributes(:email => 'an_email@a.domain', :legs => true, :face => false)
但那更加丑陋,还需要三次查询。我想我能做到
User.find_or_create_by_name_and_email_and_face_and_legs('ceilingfish','an_email@a.domain',true, false)
但这意味着我知道email
,legs
和face
的价值是什么。有谁知道这是否有一种非常优雅的方式呢?
答案 0 :(得分:21)
试试这个:
User.find_or_create_by_name(:name=>'ceilingfish',
:email => 'an_email@a.domain', :legs => true, :face => false)
当您有find_or_create_by_
的其他参数时,您必须将所有参数作为哈希传递。
User.create_with(
email: 'an_email@a.domain',
legs: true, face:false
).find_or_create_by(:name=>'ceilingfish')
答案 1 :(得分:1)
使用rails 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