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

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

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

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

185閲覧

railsでテーブルのjoinsがうまくいきません

octo11

総合スコア15

Ruby on Rails 5

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2018/12/27 14:10

#困っていること
railsのテーブル結合で、モデルのhas_one,belongs_toアソシエーションとjoinsメソッドを使ってやろうとしているのですがなかなかうまくいきません。初心者なので用語の使い方で間違っている部分があるかもしれませんがご容赦ください。

#前回の質問からの修正
一度質問しているので、質問自体は一番下にコピペしてあります。

前回から修正して、selectの部分を追加しました。

a = Source.joins(:sentence).select("sources.*,sentences.*").where(id:1)

すると、以下のようなクエリが発行されます。このクエリはMySQL上であればテーブルが結合できることが確認できました。

SELECT sources.*,sentences.* FROM `sources` INNER JOIN `sentences` ON `sentences`.`source_id` = `sources`.`id` WHERE `sources`.`id` = 1 LIMIT 1

しかし、rails上で動かすとsourceテーブルのカラムのみしか代入されていません(sentenceのカラムがない)。ここからどうすればsentenceテーブルのカラムも使えるようになるのか分からないので、ご教授いただけると非常に助かります。

##試したこと
a.associationをすると、ArgumentError (wrong number of arguments (given 0, expected 1))と返ってきました。2つのテーブルが関連づけられていないのでしょうか。

#以下、前回質問のコピー

閲覧ありがとうございます
Railsフレームワークを使ってアプリ製作中なのですが、DBの結合で詰まってしまったので質問させてください。

##質問

sourcesテーブルとsentencesテーブルを結合したいと思い、joinsを使ってみましたが、sourceのカラムしか変数に代入されていないようです。どのようにすれば、うまく結合できるのでしょうか。

##コード

[rails console上]

a = Source.joins(:sentence).where(id:1)

[結果]

Source Load (1.2ms) SELECT `sources`.* FROM `sources` INNER JOIN `sentences` ON `sentences`.`source_id` = `sources`.`id` WHERE `sources`.`id` = 1 LIMIT 11 => #<ActiveRecord::Relation [#<Source id: 1, type_id: 1, main_title: "piyopiyop", author: "gehog">]> [models/sentence.rb]
class Sentence < ApplicationRecord belongs_to :source end [models/source.rb]
class Source < ApplicationRecord has_one :sentence end

##データベース

[sentences table]

+----+---------+-----------+---------------+ | id | user_id | source_id | sentence | +----+---------+-----------+---------------+ | 1 | 1 | 1 | hogehogehoge | | 2 | 2 | 2 | 2hogehogehoge | +----+---------+-----------+---------------+

[sources table]

+----+---------+------------+--------+ | id | type_id | main_title | author | +----+---------+------------+--------+ | 1 | 1 | piyopiyop | gehog | | 2 | 2 | piyopiyopi | gehoge | +----+---------+------------+--------+

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

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

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

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

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

guest

回答1

0

ベストアンサー

sourcesテーブルとsentencesテーブルを結合したいと思い、joinsを使ってみましたが、sourceのカラムしか変数に代入されていないようです。

はい、Sourceモデルにsentence用のカラムがないので、モデルとしては取り出しづらいです。

他のテーブルにも参照したい場合は、eager_loadでJOINさせて、a.sentenceのようにリレーションから取る、のがRails的です。

投稿2018/12/27 22:41

maisumakun

総合スコア145123

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

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

octo11

2018/12/29 03:09

丁寧な回答ありがとうございます。試してみます!
octo11

2018/12/29 04:21

a = Source.eager_load(:sentence).select("sources.*,sentences.*").where(id:1) としても、a.sentenceがNo methodになってしまうのですが、これではダメですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問