ActiveRecordのmergeメソッドについて
ActiveRecordでテーブルのjoinをする場合以下のように書くと思います。
User.joins(:auth_providers).all.where(auth_providers: { provider: 'facebook' })
発行されるSQLは次のようになります。
SELECT "users".* FROM "users" INNER JOIN "auth_providers" ON "auth_providers"."user_id" = "users"."id" WHERE "auth_providers"."provider" = 'facebook'
これとは別にmergeメソッドを使う書き方もあります。
まずはモデルにscropを定義します。
class AuthProvider < ActiveRecord::Base belongs_to :user scope :facebook, -> { where(provider: 'facebook') } scope :developer, -> { where(provider: 'developer') } end
でこのscopeとmergeメソッドを使って書くと次のようになります。
User.joins(:auth_providers).all.merge(AuthProvider.facebook)
で、発行されるSQLは次のようになります
SELECT "users".* FROM "users" INNER JOIN "auth_providers" ON "auth_providers"."user_id" = "users"."id" WHERE "auth_providers"."provider" = 'facebook'
同じになりますね。
最初に書いた方のやり方で「.where(auth_providers: { provider: 'facebook' })」と書いているところをmergeメソッドで「.merge(AuthProvider.facebook)」で書くかどうかとういう話ですが、mergeメソッドを使った方が短く書けるから良い気もします。
皆様はどうでしょか?