我正在使用 Devise railscast 关注 Ryan 的Omniauth。代码的一部分是:
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 挠头。这段代码究竟做了什么?
我的猜测是 where() 语句适用于类 User。但是 Rails 怎么知道它等价于User.where(:provider => "provider_id passed by auth", :uid => "uid passed by auth")
?
我的猜测是它会产生一个集合,然后如果集合为空,则创建一个新实例user
并分配新属性。否则选择第一个实例并重新分配属性。
我的猜测正确吗?