私は 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 do で頭を悩ませています。このコードは正確に何をしますか?
私の推測では、where() ステートメントがクラス User に適用されます。しかし、Rails はそれが と同等であることをどうやって判断するのUser.where(:provider => "provider_id passed by auth", :uid => "uid passed by auth")
でしょうか?
私の推測では、コレクションが生成され、コレクションが空の場合は、新しいインスタンスを作成してuser
新しい属性を割り当てます。それ以外の場合は、最初のインスタンスを選択して属性を再割り当てします。
私の推測は正しいですか?