将额外数据传递给find_or_create

时间:2010-03-06 23:31:29

标签: ruby-on-rails

我一直想知道的关于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的价值是什么。有谁知道这是否有一种非常优雅的方式呢?

2 个答案:

答案 0 :(得分:21)

试试这个:

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')

答案 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