我正在关注Ryan的Omniauth with Devise railscast。代码的一部分是:Rails异常声明:where().first_or_create()
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
我正在抓我的头在哪里()first_or_create做。这段代码究竟做了什么?
我的猜测是where()语句应用于类User。但Rails如何知道它相当于User.where(:provider => "provider_id passed by auth", :uid => "uid passed by auth")
?
我的猜测是它会产生一个集合,那么如果集合是空的,那么创建一个新的实例user
并分配新的属性。否则,选择第一个实例并重新分配属性。
我的猜测是否正确?
感谢您的回答。您能否解释where()语句如何工作而不指定哪个属性与哪个值关联?另外,我不确定你最后的陈述是否正确。如果以前没有创建用户实例会怎么样? – AdamNYC 2013-02-22 04:25:55
我已经用一个例子更新了我的答案。 'auth.slice'返回'where'用来构成sql语句的散列。对于该块,如果没有找到,'first_or_create'将使用传递给创建对象的位置的选项。 – jvnill 2013-02-22 04:29:35
明白了。谢谢。 – AdamNYC 2013-02-22 04:34:40