Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在哪里和第一个_或_如何创建工作?_Ruby On Rails_Oauth - Fatal编程技术网

Ruby on rails 在哪里和第一个_或_如何创建工作?

Ruby on rails 在哪里和第一个_或_如何创建工作?,ruby-on-rails,oauth,Ruby On Rails,Oauth,从这段代码中,我进行了一次SQL检查,如果在任何寄存器中都没有找到provider和uid属性,那么将创建一个新的属性。没问题。 但是当创建一个新的寄存器时,它会检查provider和uid的值。这是怎么发生的?该代码不应该只创建具有email、password和name属性值的用户实例吗? 是什么使SQL插入提供程序和uid def self.from_omniauth(hash) where(provider: hash.provider, uid: hash.uid).first_

从这段代码中,我进行了一次SQL检查,如果在任何寄存器中都没有找到provider和uid属性,那么将创建一个新的属性。没问题。 但是当创建一个新的寄存器时,它会检查provider和uid的值。这是怎么发生的?该代码不应该只创建具有email、password和name属性值的用户实例吗? 是什么使SQL插入提供程序和uid

def self.from_omniauth(hash)
    where(provider: hash.provider, uid: hash.uid).first_or_create do |user|
      user.email = hash.info.email
      user.password = Devise.friendly_token[0,20]
      user.username = hash.info.name
end
日志

User Load (25.0ms)  SELECT  "users".* FROM "users" WHERE "users"."provider" = $1 AND "users"."uid" = $2  ORDER BY "users"."id" ASC LIMIT 1  [["provider", "facebook"], ["uid", "879615942106023"]]
   (10.0ms)  BEGIN
User Exists (12.2ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = 'vinibol12@yahoo.com.br' LIMIT 1
  SQL (12.7ms)  INSERT INTO "users" ("provider", "uid", "email", "encrypted_password", "username", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["provider", "facebook"], ["uid", "879615942106023"], ["email", "vinibol12@yahoo.com.br"], ["encrypted_password", "$2a$10$z3oK6H1P5Z0It7VliVw1hehF.Mn1kFlvZbru919lDR.IiHb94Ha/u"], ["username", "Vinicius Antonio Bolzani"], ["created_at", "2015-07-20 08:58:04.227271"], ["updated_at", "2015-07-20 08:58:04.227271"]]
   (2.4ms)  COMMIT

first_或_create的工作方式是首先在数据库中搜索where子句中的属性。如果发现,它将不会创建新的,如果失败,它将创建一个新的。现在,即使对于新用户,查询也不知道给定的uid和提供程序是否存在,因此必须首先运行查询以确保。看看这个。”如果失败,请先尝试加载记录,然后再创建。

如果在数据库中找不到记录,则会创建新记录,并且在创建记录时会使用用于搜索的参数,这就是为什么会得到
提供程序
uid
设置。如果您没有通过任何块,您将在DB中获得新记录,仅使用
provider
uid
设置。

这是我需要的解释,但在文档中找不到。谢谢在4中选择你的答案。