やりたいこと
データの抽出
多くの場合、データの検索や抽出を行う際にはwhere文などを使用して、
1つのデータを判断基準に複数のデータを見て、一致するデータを探すと思います。
ですが今回は、複数のデータを判断基準に複数のデータを見て一致するデータを探したいです。
具体的に言うと...
.Trip
とCalendar
をjoinsで結合した上で、@stop_times
のtrip_id
とTrip
のtrip_id
が一致しているCalendar
のカラム全てを抽出し、@joins
へ代入したいです。@stop_times
もtrip
もデータは複数個入っています。
開発環境
・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が原因ではないのかなとは思います。
どうかお力をお貸しください。