我必须通过api以编程方式创建用户 - 我能够创建传递适当参数的用户,即:
x={"email"=>"kid@kid.com", "username"=>"levi", "password"=>"password","password_confirmation" => "password", "firstname"=>"Bob", "lastname"=>"Smith"}
u=User.new(x)
u.valid?
能够在保存之前检查这是否是有效用户等。但问题是如果用户名或电子邮件之类的参数已经存在于另一个用户,我将在保存时收到错误。
现在我可以检查用户是否已经存在(即u=User.where(username: x['username'])
或u=User.where(email: x['email']
) - 这可能就够了,但我想知道是否有办法u=User.where(x).first_or_create with devise
?通常与其他模型一起使用但不设计。
答案 0 :(得分:0)
find_or_create_by(http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by)的问题在于它会尝试查找与您传入的属性所有匹配的用户作为条件。它很少是一种有用的方法。相反,将其包装在您的模型中:
class User < ActiveRecord::Base
def self.username_find_or_create(attributes = {})
User.create(attributes) unless User.exists?(attributes.slice(:username, :email))
end
end
(Exists比其他地方快)