Ruby on rails 传递额外数据以查找或创建

Ruby on rails 传递额外数据以查找或创建,ruby-on-rails,Ruby On Rails,关于rails,我一直想知道的是,它能够传递额外的数据,以便在rails中找到或创建方法。例如,我不能做以下事情 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

关于rails,我一直想知道的是,它能够传递额外的数据,以便在rails中找到或创建方法。例如,我不能做以下事情

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
的值是什么。有人知道有没有一种真正优雅的方法可以做到这一点吗?

试试这个:

User.find_or_create_by_name(:name=>'ceilingfish', 
        :email => 'an_email@a.domain', :legs => true, :face => false)
当您有其他参数要查找或创建时,您必须将所有参数作为散列传递

轨道4 使用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

哇,太棒了,谢谢Kandada,我注意到的唯一一个怪癖是,如果任何属性无效(比如在上面的示例中,电子邮件有一个验证模式,检查了正确的tld),那么以下属性都没有设置(所以腿和脸仍然是零)@Ceilingfish:实际上,你的第一个表单不起作用是一个bug。对于现有用户,:email,:legs和:face元素将不会更新。@guiding5这就是为什么该函数被调用为
find\u或\u create\u by
。只有当用户不存在时才创建用户,否则将返回使用密钥找到的用户。现在呢?弃用警告:此动态方法已弃用。请使用Post.find_或create_by(名称:'foo')代替。
User.find_or_create_by(first_name: 'Scarlett') do |user|
  user.last_name = 'Johansson'
end