"u-6ren">
gpt4 book ai didi

ruby-on-rails - Rails 异常语句 : where( ). first_or_create( )

转载 作者:行者123 更新时间:2023-12-03 15:36:10 28 4
gpt4 key购买 nike

我正在关注 Ryan 的 Omniauth with Devise rails 广播。部分代码是:

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

我在用 where().first_or_create do 挠头。这段代码究竟做了什么?

我的猜测是 where() 语句适用于类 User。但是 Rails 怎么知道它等价于 User.where(:provider => "provider_id pass by auth", :uid => "uid pass 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' }

first_or_create

相当于find_or_create_by。您可以阅读 documentation并看到它搜索与传递给 where 的选项匹配的任何记录。如果没有找到记录,它会尝试使用这些选项作为属性创建记录。

通过的 block

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

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

关于ruby-on-rails - Rails 异常语句 : where( ). first_or_create( ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016612/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com