Forum: Ruby on Rails Query a timetable (cute solution?)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
167a3b5582230623eb94e638133122ec?d=identicon&s=25 kris (Guest)
on 2006-03-29 14:55
I am developing app which needs to query a timetable. The user specifies
where they want to go from (start_station) and to (end_station) and the
time (start_time) they wish to leave.

My models are as follows:

Provdier -> Service -> Run -> Stop <- Station

-> = has many
Provider = Bus Company
Service = eg. Number 10 bus
Run = Column on timetable
Stop = Cell on timetable
Station = Row on timetable

Really provider and service dont come in to the equation and can be
ignored.


Station_A  09:45  11:23  12:01	2:30
Station_B  09:47  11:25  12:05	2:33
Station_C  09:55  11:31  12:15	2:37
Station_D  10:10  11:42  12:23	2:43
Station_E  10:25  11:45  12:30	2:51

So I need to find all runs (columns) where the end_station follows the
start_station.

This is the code I have at the moment, which finds two stations in the
same run, and does not take in to account either the start_time or
end_station coming after start_station. It works but is *very* database
intensive, and that with only a small amount of sample data. This stikes
me as a problem which has a cute solution.


# params[:search][:start_station].class => string
# params[:search][:end_station].class => string
# params[:search][:start_time].class => time

# Do actual search
@matches = Array.new

@start_station = Station.find(:first, :conditions => 'name = "' +
params[:search][:start_station] + '"', :include => :stops)
@end_station = Station.find(:first, :conditions => 'name = "' +
params[:search][:end_station] + '"')

@start_station.stops.each do |stop|
  @joining_stops = stop.run.stops
  @joining_stops.each do |stop|
    if stop.station.id = @end_station.id
      @matches.push(stop.run)
      break
    end
  end
end


Can anyone suggest a better(simpler) way of approching this problem?
5af2dac7687e6b644c67c5a980593add?d=identicon&s=25 Petey (Guest)
on 2006-05-16 14:47
Maybe use .collection and .uniq to get the results without duplicates?
This topic is locked and can not be replied to.