Ruby Enumerators
I have a rails app that handles a lot of information about a set of experimental plates. Along with holding information about each plate, I have another table locations, that’s nested with the plates, as in plates has_many locations and locations belongs_to plates. The locations is a separate table because these plates can get shipped to different locations a lot. This is a way for us to track where all the plates are. Most importantly, we want to know which location for a give plate has the latest date, because this will tell us where the plate currently is.
For the most part, there are only a limited number of places where the plate will be. We have a list in the model. On our main page, I wanted to have a link to each of the main places showing which plates are at that location. Here’s how I did it:
In my controller
def plates_at_uc @all = Plate.by_serial_number @title = 'UC' @plates = Enumerator.new do |y| @all.map do |plate| unless(plate.locations.empty?) if (plate.locations.current_location.last.location == 'UC') y << plate end end end end render action: "plates_by_location" end
I have a method for each of the locations where the plates could be. The important bit here is the enumerator that I set up. This sets up the instance variable with all the plates that I’m going to display in the view. I have to go through each plate and find its present location. If that location equals the one I want (in this case UC), I add the plate to my enumerator. I set up @title so that I can use the same view for the results and display the location in the title of the page.