将额外数据传递给find_or_create

我一直想知道的关于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) 

但这意味着我知道emaillegsface的价值。 有谁知道这是否有一种非常优雅的方式?

试试这个:

 User.find_or_create_by_name(:name=>'ceilingfish', :email => 'an_email@a.domain', :legs => true, :face => false) 

当您有find_or_create_by_其他参数时,您必须将所有参数作为哈希传递。

Rails 4

  User.create_with( email: 'an_email@a.domain', legs: true, face:false ).find_or_create_by(:name=>'ceilingfish') 

使用rails 4.x.

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

用这个

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