July 21, 2016
This blog is part of our Rails 5 series.
users(:id, :name)
posts(:id, :title, :user_id)
comments(:id, :description, :user_id, :post_id)
>> Post.joins(:comments).group(:user_id).count
Mysql2::Error: Column 'user_id' in field list is ambiguous: SELECT COUNT(*) AS count_all, user_id AS user_id FROM `posts` INNER JOIN `comments` ON `comments`.`post_id` = `posts`.`id` GROUP BY user_id
As we can see user_id has conflict in both projection and GROUP BY as they
are not prepended with the table name posts in the generated SQL and thus,
raising SQL error Column 'user_id' in field list is ambiguous.
This issue has been addressed in Rails 5 with this pull request.
With this fix, we can now group by columns having same name in both the
tables.
users(:id, :name)
posts(:id, :title, :user_id)
comments(:id, :description, :user_id, :post_id)
>> Post.joins(:comments).group(:user_id).count
SELECT COUNT(*) AS count_all, "posts"."user_id" AS posts_user_id FROM "posts" INNER JOIN "comments" ON "comments"."post_id" = "posts"."id" GROUP BY "posts"."user_id"
=> { 1 => 1 }
This shows that now both projection and Group By are prepended with the
posts table name and hence fixing the conflict.
If this blog was helpful, check out our full blog archive.