Ruby on rails Rails异常语句:where().first\u或\u create()

Ruby on rails Rails异常语句:where().first\u或\u create(),ruby-on-rails,Ruby On Rails,我在跟踪Ryan的火车司机。守则的一部分是: class User < ActiveRecord::Base def self.from_omniauth(auth) where(auth.slice(:provider, :uid)).first_or_create do |user| user.provider = auth.provider user.uid = auth.uid user.username = auth.info

我在跟踪Ryan的火车司机。守则的一部分是:

class User < ActiveRecord::Base   
  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.username = auth.info.nickname
    end
  end
end
class用户
我正在用where()搔头。首先\u或\u创建do。这段代码到底是做什么的

我猜where()语句应用于User类。但是Rails如何知道它相当于
User.where(:provider=>“provider\u id passed by auth”,:uid=>“uid passed by auth”)

我猜它会生成一个集合,如果集合为空,则创建一个新实例
user
,并分配新属性。否则,选择第一个实例并重新分配属性


我的猜测正确吗?

让我们把它分成几部分

auth.slice(:provider,:uid)

auth是包含:provider和:uid键的哈希。调用.slice进行身份验证将返回一个新的哈希值,其中只有这些作为键。即

auth = { provider: 'foo', uid: 'bar', some_other_key: 'blah' }
new_hash = auth.slice(:provider, :uid) # { provider: 'foo', uid: 'bar' }
先创建或创建

相当于通过
查找或创建。您可以阅读并看到它搜索与传递到
where
的选项匹配的任何记录。如果没有找到记录,它将尝试创建一个将这些选项作为属性的记录

街区过去了

user.provider = auth.provider
user.uid = auth.uid
user.username = auth.info.nickname

实际上只需要最后一行。前两行是多余的,因为它在where选项中。

谢谢您的回答。您能否解释where()语句如何工作,而不指定哪个属性与哪个值关联?另外,我不确定你最后的说法是否正确。如果之前没有创建用户实例呢?我已经用一个例子更新了我的答案
auth.slice
返回一个散列,该散列由
where
用于形成sql语句。对于块,
first\u或_create
使用传递到何处的选项来创建对象(如果找不到)。