私はこのコードを持っています
User.find(:all, :limit => 10, :joins => :user_points,
:select => "users.*, count(user_points.id)", :group =>
"user_points.user_id")
次のSQLを生成します
SELECT users.*, count(user_points.id)
FROM `users`
INNER JOIN `user_points`
ON user_points.user_id = users.id
GROUP BY user_points.user_id
LIMIT 10
User.find_by_sql
および手動でクエリを入力する以外の方法で、INNER JOINの代わりにLEFT JOINを作成することはできますか?
これを試すことができます
User.find(:all, limit: 10,
joins: "LEFT JOIN `user_points` ON user_points.user_id = users.id" ,
select: "users.*, count(user_points.id)",
group: "user_points.user_id")
後で参照するために、:all
を追加すると、非推奨のメッセージが表示されます。 Railsの以降のバージョンでは、次のようにメソッドを単純にチェーンできます。
User.joins("LEFT JOIN `user_points` ON user_points.user_id = users.id").select("users.*, count(user_points.id)").group("user_points.user_id")
または、次のようにscopeを使用します。
scope :my_scope_name_here, -> {
joins("LEFT JOIN `user_points` ON user_points.user_id = users.id")
.select("users.*, count(user_points.id)")
.group("user_points.user_id")
}
.where
と.join
の間に.select
をチェーンすることもできます。これが将来誰かを助けることを願っています。
Rails 5には left_outer_joins メソッドがあります。だからできる
User.left_outer_joins(:user_points)
またはエイリアスを使用します
User.left_joins(:user_points)