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

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

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

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

1回答

912閲覧

複数のデータを持っている変数同士の条件抽出・検索(rails)

mikan7777

総合スコア0

Ruby

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/10/25 09:17

編集2021/10/27 08:43

やりたいこと

データの抽出
多くの場合、データの検索や抽出を行う際にはwhere文などを使用して、
1つのデータを判断基準に複数のデータを見て、一致するデータを探すと思います。
ですが今回は、複数のデータを判断基準に複数のデータを見て一致するデータを探したいです。

具体的に言うと...
.TripCalendarをjoinsで結合した上で、@stop_timestrip_idTriptrip_idが一致しているCalendarのカラム全てを抽出し、@joinsへ代入したいです。@stop_timestripもデータは複数個入っています。

開発環境

・cloud9
・Ruby on Rails

テーブル・モデル

stopsテーブル(一部抜粋)

create_table :stops do |t|     t.integer :stop_id   t.string :stop_name end

Stopモデル

class Stop < ApplicationRecord end ```--- stop_timesテーブル

create_table "stop_times", force: :cascade do |t|
t.string "trip_id"
t.time "arrival_time"
t.time "departure_time"
t.integer "stop_id"
t.integer "stop_sequence"
t.string "stop_headsign"
t.integer "pickup_type"
t.integer "drop_off_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["stop_id"], name: "index_stop_times_on_stop_id"
end

StopTimeモデル

class StopTime < ApplicationRecord
belongs_to :trip, primary_key: :trip_id ,optional: true
end

StopTimeデモデータ

trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled
1全日_06時05分_系統104001,06:05:00,06:05:00,102_01,1,楡木,0,1,0
1全日_06時05分_系統104001,06:05:00,06:05:00,103_01,2,楡木,0,0,350
1全日_15時35分_系統104005,16:23:00,16:23:00,132_01,31,大芦別所入口,0,0,24340

--- tripsテーブル

create_table "trips", primary_key: "trip_id", id: :string, force: :cascade do |t|
t.integer "route_id"
t.string "service_id"
t.string "trip_headsign"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["trip_id"], name: "sqlite_autoindex_trips_1", unique: true
end

Tripモデル

class Trip < ApplicationRecord
self.primary_key = :trip_id
has_many :stop_times
belongs_to :calendar, foreign_key: :service_id, optional: true
end

Trip デモデータ

route_id,service_id,trip_id,trip_headsign,direction_id,block_id,trip_short_name,shape_id,jp_trip_desc
16,平日,2平日_06時54分_系統101001,マリンプラザ前,0,,,,正月特別ダイヤ
16,平日,2平日_09時20分_系統101001,マリンプラザ前,0,,,,正月特別ダイヤ
16,土日祝,3土日祝_06時54分_系統101002,マリンプラザ前,0,,,,正月特別ダイヤ

--- calendarsテーブル

create_table "calendars", force: :cascade do |t|
t.string "service_id"
t.integer "monday"
t.integer "tuesday"
t.integer "wednesday"
t.integer "thursday"
t.integer "friday"
t.integer "saturday"
t.integer "sunday"
t.integer "start_date"
t.integer "end_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

Calendarモデル

class Calendar < ApplicationRecord
self.primary_key = :service_id
has_many :trips, foreign_key: :service_id
end

Calendarデモデータ

service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
全日,1,1,1,1,1,1,1,20210625,20220630
平日,1,1,1,1,1,0,0,20210625,20220630
土日祝,0,0,0,0,0,1,1,20210625,20220630

コード --- Controllerファイル ```ruby @stops = Stop.find(params[:id]) @stop_times = StopTime.where(stop_id: @stops.stop_id).all //下記コードのwhere???の部分で抽出し、@joinへ代入したい↓ //service_idで結合 @join = Calendar.joins(:trips).select('calendars.*, trips.*').where(???).all

試したコード

@join = Calendar.joins(:trips).select('calendars.*, trips.*').where('trips.trip_id = ?', @stop_times.trip_id)

ruby

1@stop_times.each do |s| 2 @join = Calendar.joins(:trips).select('calendars.*, trips.*').where('trips.trip_id = ?', s.trip_id).all 3 4end

ruby

1i = 0 2@stop_times.each do |s| 3    sa = [i][:trip_id] 4 @join = Calendar.joins(:trips).select('calendars.*, trips.*').where('trips.trip_id = ?', sa).all 5 i = i + 1 6 7end

ダメな理由はなんとなくわかるのですが、実現方法がわかりません。
joinせず、Trip.where(...)としてもエラーが出たため、joinが原因ではないのかなとは思います。
どうかお力をお貸しください。

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

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

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

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

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

winterboum

2021/10/25 10:57

[@stop_timesのtrip_idと一致するTripのtrip_idだけを抽出し、代入] というのがわかりません。 まず [@stop_timesのtrip_idと一致するTripのtrip_id] でしたら trip_id です。 databaseにアクセスすることはないです。 [trio_idが「@stop_timesのtrip_id」と一致するTrip] という意味ですか? つぎに、「代入」がわかりません。どの変数、もしくはどのモデルのどの項目に「代入」するのでしょう
winterboum

2021/10/25 10:58

あと、 modelのcodeも載せてください
mikan7777

2021/10/27 08:17

ご返信が遅くなりすみません。修正・モデルの追加をいたしました。 何卒ご教授よろしくお願いします。
winterboum

2021/10/27 08:25

@stop_timesのtrip_idとTripのtrip_idが一致しているCalendar というのがわからん。 この3つのモデルのでもデータと、それを元に どのCalendarを得るのか 示してください
mikan7777

2021/10/27 08:46

デモデータ等追記しました。よろしくお願いします。
winterboum

2021/10/27 08:57

で、この場合にどのCalendarがえらばれるの?
guest

回答1

0

Calendar has_many :trips で Trip has_many :stop_times
Calendar を stop_times の id で絞り込み、この id はある Stop との関連から決定される
ということだとすると

ruby

1@stop = Stop.find(params[:id]) 2@stop_times = StopTime.where(stop_id: @stop.stop_id) 3 4@calendars = 5 Calendar 6 .joins(:trips => :stop_times) 7 .where(stop_times: { id: @stop_times.ids })

きちんと関連を設定すれば以下のようにして取得できそうですが、
独自の主キーなど標準から外れた場合では試したことがありません

ruby

1class Stop 2 has_many :stop_times 3 has_many :trips, through: :stop_times 4 has_many :calendars, through: :trips 5end 6 7@calendars = Stop.find(params[:id]).calendars 8

投稿2021/10/27 10:40

neko_daisuki

総合スコア2090

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問