質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1304閲覧

ActiveRecordで内部結合したSQLが生成できない

imamoto_browser

総合スコア1161

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/04/21 15:27

編集2018/04/22 11:44

レビユーの★の数で検索する検索サービスを作っているのですが、projectsテーブルとreviewsテーブルを内部結合した結果を取得したいです。

#わからないこと
下記のエラーの解消方法がわからない

undefined method `belong_to' for #Class:0x007fdd747099b0

Extracted source (around line #113):

<ul> <% @projects.each do |project| %> <%= link_to image_tag(project.pict_path), project_path(project.id) %> <% end %>

controller

ruby

1def index 2 if params[:title].present? && params[:star].present? 3 @projects = Project.where(title: params[:title]).page(params[:page]).per(PER) 4 elsif params[:title].present? 5 @projects = Project.where(:title => params[:title]).page(params[:page]).per(PER) 6 elsif params[:star].present? 7 @projects = Project.joins(:reviews).where(:star => params[:star]).page(params[:page]).per(PER) 8 else 9 @projects = Project.page(params[:page]).per(PER) 10 end 11end

models

ruby

1class Review < ActiveRecord::Base 2 belong_to :projects 3 self.table_name = 'reviews' 4end

ruby

1class Project < ActiveRecord::Base 2 3 has_many :reviews 4 5 validates :title, 6 presence: { message: "入力してください" }, 7 length: { minimum: 3, message: "3文字以上必要"} 8end 9

view

ruby

1<%=form_tag({ :controller => 'projects', :action => 'index' }, 2{ :method => :get}) do %> 3<%= label_tag(:q, "Search for:") %> 4<%= text_field_tag 'title' %> 5<br> 6<br> 7<%= label_tag(:q, "★ 5以上") %> 8<%= radio_button_tag 'star', '5' %> 9<br> 10<%= label_tag(:q, "★ 4以上") %> 11<%= radio_button_tag 'star', '4' %> 12<br> 13<%= label_tag(:q, "★ 3以上") %> 14<%= radio_button_tag 'star', '3' %> 15</p> 16<p> 17</p> 18<%= submit_tag("Search") %> 19<p> 20<% end %> 21<ul> 22 23 24<% @projects.each do |project| %> 25<%= link_to image_tag(project.pict_path), project_path(project.id) %> 26 27<% end %> 28<%= paginate @projects %> 29

追記:

@projects = Project.joins(:reviews).where(:star => params[:star])

だと

生成されるSQLは、

SELECT "projects".* FROM "projects" INNER JOIN "reviews" ON "reviews"."project_id" = "projects"."id" WHERE "projects"."star" = '5' LIMIT 3 OFFSET 0

なのですが、

SELECT "projects".* FROM "projects" INNER JOIN "reviews" ON "reviews"."id" = "projects"."item_id" WHERE "reviews"."star" = '5' LIMIT 3 OFFSET 0

を生成するにはどのように書くべきでしょうか。

追記2:

ruby

1@projects = Project.joins(:reviews).preload(:reviews).where("reviews.star >= ?" , params[:star]).page(params[:page]).per(PER)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、belong_toではなくbelongs_toと、三単現のsが必要です。

投稿2018/04/21 22:22

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imamoto_browser

2018/04/22 06:55

ありがとうございます。 belongs_toになおしたところ、エラーが消えました。 ともかくrails4が遅くて、has_manyからbelongs_toに直しただけで10秒以上リロードに時間がかかってしまうのですが、とりあえず一番効果的であろう定番の速度改善ってありますでしょうか。今考えているのはunicornの採用、速度改善するgemのインストール、生成されるクエリの見直しなどです。
imamoto_browser

2018/04/22 11:45

とりあえず本文に追記したように修正すると、ロード時間が劇的に短くなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問