通过给定id的assosiation查找has_many中的第一个和最后一个对象

时间:2017-10-29 08:53:46

标签: ruby-on-rails ruby

首先,我是初学者,请不要通过我的西红柿:) 我有模特:

class RailwayStation < ApplicationRecord
  has_many :trains, foreign_key: :current_station_id
  has_many :railway_stations_routes
  has_many :routes, through: :railway_stations_routes
end

class Route < ApplicationRecord
  has_many :railway_stations_routes
  has_many :trains
  has_many :railway_stations, through: :railway_stations_routes
end

class RailwayStationsRoute < ApplicationRecord
  belongs_to :railway_station
  belongs_to :route
end

class Train < ApplicationRecord
  belongs_to :current_station, class_name: 'RailwayStation', foreign_key: :current_station_id
  belongs_to :route
  has_many :tickets
  has_many :wagons
end

例如station_from = 1和station_last = 9 现在我需要找到沿着这条路线行驶的所有列车。在路线我需要条件:

  • railway_station.first.id = station_from
  • railway_station.last.id = station_last

我知道我需要使用joins.where但不知道如何......

更新 这段代码有效,但我认为有一个更好的解决方案:

routes_from = Route.joins(:railway_stations).where('railway_stations.id': 1)
routes_to = Route.joins(:railway_stations).where('railway_stations.id': 2)
routes_from.each do |route_from|
  routes_to.where(id: route_from).each do |route|
    route.trains.each do |train|
      @trains ||= []
      @trains << train
    end
  end
end

1 个答案:

答案 0 :(得分:0)

我不知道你想如何在路线关系内对火车站进行分类。我认为你需要在RailwayStationsRoute添加数字进行排序。

一般来说,你可以这样做:

rw_from = RaillwayStation.find(1)
rw_to = RaillwayStation.find(2)
trains = Train.where(route: rw_from.routes & rw_to.routes)