teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

質問したいこと、自分で調べたこと、現在起こっていることを追記

2020/12/06 09:52

投稿

Takum
Takum

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,26 @@
1
+ ##質問したいこと
2
+ SQLで実行できたコードをruby on railsのコードに置き換えたいので、それを実現するためのアドバイスを頂きたいです。
3
+
4
+ ##自分で調べたこと、実行したこと
5
+ [http://www.scuttle.io/](http://www.scuttle.io/)
6
+ こちらのサイトにSQLのコードを打ち込み、railsのコードに変換して、そのコードをcontrollerに貼って実行してみたところ、
7
+
8
+ ```ここに言語を入力
9
+ ActiveRecord::StatementInvalid in Posts#index
10
+
11
+ SQLite3::SQLException: no such column: thanks.like_count: SELECT "post_comments"."user_id",
12
+
13
+ SUM("thanks"."like_count") AS sum_like_count FROM "post_comments" INNER JOIN "thanks" ON
14
+
15
+ "post_comments"."id" = "thanks"."post_comment_id" GROUP BY "post_comments"."user_id"
16
+
17
+ ORDER BY "sum_like_count" ASC LIMIT ?
18
+ ```
19
+
20
+ というエラーが表示されています。
21
+
22
+
23
+
1
24
  ##実現したいこと
2
25
  ruby on railsでポートフォリオを製作中です。そのポートフォリオでランキング機能を実装したいです。
3
26
  ランキング機能の詳細ですが、記事を投稿し、他の人がその記事にコメントが出来ます。記事の投稿者はそのコメントが有益だと感じれば、ありがとうを押す事が出来ます。そのいいねを多く取得しているユーザーをランキング化したいです。
@@ -31,8 +54,12 @@
31
54
  user_id = 1が4位になります。
32
55
 
33
56
  ##railsで置き換えたコード
34
- PostComment.all.select("user_id, sum(thanks.like_count) as sum_like_count").left_joins(Thank.all.select("post_comment_id, count(post_comment_id) as like_count")) as thanks.group(:user_id).order(:sum_like_count).limit(4)
35
-
36
- ##エラーメッセージ
37
- SyntaxError
38
- /home/vagrant/work/worry/app/controllers/posts_controller.rb:37: syntax error, unexpected tIDENTIFIER, expecting keyword_end )) as thanks ^~
57
+ PostComment.select(
58
+ [
59
+ :user_id, Arel::Nodes::NamedFunction.new('SUM', [Thank.arel_table[:like_count]]).as('sum_like_count')
60
+ ]
61
+ ).joins(
62
+ PostComment.arel_table.join(Thank.arel_table).on(
63
+ PostComment.arel_table[:id].eq(Thank.arel_table[:post_comment_id])
64
+ ).join_sources
65
+ ).order(:sum_like_count).group(:user_id).limit(4)