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

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回答

2442閲覧

Ruby on Railsの関連付けされているテーブル二つの関連しているカラムを同時に取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2016/01/11 09:39

こんにちは。最近、teratailにとてもお世話になっております。

現在、Ruby on railsで参考書のレビューサイトを開発しておりまして、その際に、関連付けをしているテーブルBooksとReviewsの二つから関連しているレコードを同時に取得したいのですが、良い方法が思いつきませんでしたので、ここで質問させていただきます。
現状、思いついたのは下のコードです。

Ruby

1//books_controller.rb 2@review = Review.new 3book_datas = Book.all 4@set_datas = Hash.new //本とレビュー情報を入れるハッシュ 5 6 book_datas.each do |b_data| 7 r_data = @review.class.where(book_id: b_data.id) //本と関連するレビューをReviewテーブルから取得 8 if r_data //もし本と関連するレビューが見つかったら 9 @set_datas = {:book => b_data, :review => r_data} //本のデータと、レビューのデータをハッシュに入れる 10 end 11 end

booksテーブル,reviewテーブルそれぞれの構造は以下の通りです。

CREATE TABLE books (
id int(11) NOT NULL AUTO_INCREMENT,
title varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
price int(11) DEFAULT NULL,
image_url text COLLATE utf8_unicode_ci,
amazon_url text COLLATE utf8_unicode_ci,
created_at datetime NOT NULL,
updated_at datetime NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE reviews (
id int(11) NOT NULL AUTO_INCREMENT,
user_id bigint(20) DEFAULT NULL,
book_id int(11) DEFAULT NULL,
content text COLLATE utf8_unicode_ci,
created_at datetime NOT NULL,
updated_at datetime NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


##質問
思いつきでコントローラだけ書いてみましたが、このような場合、どのような取得の仕方をするのが最適なのでしょうか?
何か助言を頂けますとありがたいです。
長々となってしまい、すみませんが、宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

Rails に has_many や belongs_to といった関連を表すための機能が用意されています。
参考 : Rails4で1対多のリレーションをモデルに実装する

この機能を利用すると下記の通りに書けるようになります。

ruby

1books = Book.all 2books.each do |book| 3 # bookに関連する reviewを取得する 4 book.reviews 5end

このようにかければ、@set_data という変数を用意するまでもなく、
viewに直接 @booksなどを渡せば済みます。

これを実現するための設定は下記の通りになります。

ruby

1# /app/models/book.rb 2class Book 3 # book は 複数の review を持っているので複数形で書く 4 has_many :reviews 5end 6 7# /app/models/review.rb 8# 下記は必須ではありませんが、逆に `review.book` というように review から bookにアクセスしたい時に利用します。 9# 10class Review 11 # review は 一つの book しかもたないので単数形で書く 12 belongs_to :book 13end

投稿2016/01/11 09:51

編集2016/01/11 09:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/01/11 10:58

yamagenさん、ご回答ありがとうございます! すでにhas_manyとblongs_toは設定していたのですが、その特性をまったく活かしきれていませんでした。。 気づかせていただきありがとうございます。 今回、Bookテーブルのtitleと、その本に関連したReviewテーブルのcontent(本のレビュー内容)を取得したいので、以下のように書いたのですが、アプローチとしては間違っていませんでしょうか? お手数ですが、こちらもアドバイスを頂けますとありがたいです! books = Book.all books.each do |book| # bookに関連する reviewを取得する @review_datas = book.reviews end reviews = Review.all reviews.each do |review| @book_datas = review.book end
退会済みユーザー

退会済みユーザー

2016/01/11 11:12 編集

申し訳ありません。 いまいち何を実現したいのかわかりません。 単純に title と reviews の一覧を表示したいのであれば、 下記の通りになります。 ``` # controller def index @books = Book.all end # view <% books.each do |book| %> <p><%= book.title %></p> <% if book.reviews.present? %> <% book.reviews.each do |review| %> <p><%= review.content %></p> <% end %> <% end %> <% end %> ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問