##質問したいこと
SQLで実行できたコードをruby on railsのコードに置き換えたいので、それを実現するためのアドバイスを頂きたいです。
##自分で調べたこと、実行したこと
http://www.scuttle.io/
こちらのサイトにSQLのコードを打ち込み、railsのコードに変換して、そのコードをcontrollerに貼って実行してみたところ、
ActiveRecord::StatementInvalid in Posts#index SQLite3::SQLException: no such column: thanks.like_count: SELECT "post_comments"."user_id", SUM("thanks"."like_count") AS sum_like_count FROM "post_comments" INNER JOIN "thanks" ON "post_comments"."id" = "thanks"."post_comment_id" GROUP BY "post_comments"."user_id" ORDER BY "sum_like_count" ASC LIMIT ?
というエラーが表示されています。
##実現したいこと
ruby on railsでポートフォリオを製作中です。そのポートフォリオでランキング機能を実装したいです。
ランキング機能の詳細ですが、記事を投稿し、他の人がその記事にコメントが出来ます。記事の投稿者はそのコメントが有益だと感じれば、ありがとうを押す事が出来ます。そのいいねを多く取得しているユーザーをランキング化したいです。
少し複雑なランキング機能になっているので、データベースをSQL文で操作し、意図するデータを取り出す事が出来ました。
ただ、そのSQLをrailsのコードに置き換えたときにシンタックスエラーが表示されます。
##SQLのコード
select user_id, sum(thanks.like_count) as sum_like_count
from post_comments
left join (
select post_comment_id, count(post_comment_id) as like_count
from thanks
group by post_comment_id
) as thanks
on post_comments.id = thanks.post_comment_id
group by user_id
order by sum_like_count
limit 4;
+---------+----------------+
| user_id | sum_like_count |
+---------+----------------+
| 1 | 1 |
| 3 | 2 |
| 7 | 3 |
| 8 | 3 |
+---------+----------------+
4 rows in set (0.00 sec)
この場合、user_id = 7,8が1位、
user_id = 3が3位、
user_id = 1が4位になります。
##railsで置き換えたコード
PostComment.select(
[
:user_id, Arel::Nodes::NamedFunction.new('SUM', [Thank.arel_table[:like_count]]).as('sum_like_count')
]
).joins(
PostComment.arel_table.join(Thank.arel_table).on(
PostComment.arel_table[:id].eq(Thank.arel_table[:post_comment_id])
).join_sources
).order(:sum_like_count).group(:user_id).limit(4)
あなたの回答
tips
プレビュー